Importing Libraries
library("ggpubr")
Loading required package: ggplot2
library("gridExtra")
library("tidyverse")
── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ lubridate 1.9.2 ✔ tibble 3.2.1
✔ purrr 1.0.2 ✔ tidyr 1.3.0── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::combine() masks gridExtra::combine()
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library("ggplot2")
library("ggridges")
library("tidyr")
library("readxl")
library("stringr")
library("ggrepel")
library("gridExtra")
library("patchwork")
library("viridis")
Loading required package: viridisLite
library("broom")
Importing State Region Details
State.Region.Details <- read.table("state_abbrevs.txt", sep = " ", header = TRUE)
State.Region.Details
Importing Consumer Price Index Data
Consumer.Price.Index <- read.csv("cpi.csv", header = TRUE) %>% select(-Series.ID, -Label)
Consumer.Price.Index
Census <- read.csv("combinedcensuspop.csv", header = TRUE) %>%
select(-GISJOIN, -STATEFP, -STATENH, -NAME) %>%
filter(YEAR >= 1975 & YEAR <= 2019) %>%
filter(STATE != 'Puerto Rico') %>%
filter(STATE != 'District of Columbia') %>%
dplyr::rename("State" = "STATE", "Population" = "A00AA", "Year" = "YEAR")
Census
Importing Census Data for the Year 1990
Census.1990 <- read.csv("combinedcensuspop.csv", header = TRUE) %>%
filter(YEAR == 1990) %>%
select(-GISJOIN, -YEAR, -STATEFP, -STATENH, -NAME) %>%
dplyr::rename("State" = "STATE", "Population" = "A00AA")
Census.1990
Importing Census Data for the Year 2000
Census.2000 <- read.csv("combinedcensuspop.csv", header = TRUE) %>%
filter(YEAR == 2000) %>%
select(-GISJOIN, -YEAR, -STATEFP, -STATENH, -NAME) %>%
dplyr::rename("State" = "STATE", "Population" = "A00AA")
Census.2000
Importing Census Data for the Year 2010
Census.2010 <- read.csv("combinedcensuspop.csv", header = TRUE) %>%
filter(YEAR == 2010) %>%
select(-GISJOIN, -YEAR, -STATEFP, -STATENH, -NAME) %>%
dplyr::rename("State" = "STATE", "Population" = "A00AA")
Census.2010
Importing Census Data for the Year 2019
Census.2019 <- read.table("censuspop2019.txt", sep = " ", header = TRUE) %>%
filter(variable == "POP") %>%
select(-GEOID, -variable) %>%
dplyr::rename("State" = "NAME", "Population" = "value")
Census.2019 <- head(Census.2019, 51)
Census.2019
Importing Density Data for the Year 2019
Density.2019 <- read.table("censuspop2019.txt", sep = " ", header = TRUE) %>%
filter(variable == "DENSITY") %>%
select(-GEOID, -variable) %>%
dplyr::rename("State" = "NAME", "Density" = "value")
Density.2019 <- head(Density.2019, 51)
Density.2019$Density = round(Density.2019$Density, 2)
Density.2019
Combined.2019 <- Census.2019 %>%
inner_join(Density.2019, by = join_by(State == State))
Combined.2019
Importing Data for the Year 1975
Combined.1975 <- read.csv("Density1975 - Density1975.csv", header = TRUE) #%>% dplyr::rename("Population.1975" = "Population", "Density.1975" = "Density")
Combined.1975$Density = round((Combined.1975$Density * 100.01) / 99.9, 2)
Combined.1975
Census.1975 <- Combined.1975 %>% select(-Density)
Census.1975
Question - 1
houses_long <- data.frame(gather(House.Price.Index, key="State", value="House.Prices", 3:53))
House_Price_Data <-
data.frame(houses_long %>%
inner_join(Consumer.Price.Index, by = c("Year", "Period")) %>%
dplyr::rename("CPI.Values" = "Value"))
House_Price_Data
compare_2019_1975 <-
data.frame(House_Price_Data %>%
left_join(State.Region.Details, by = join_by(State == Code)) %>%
dplyr::rename("Code" = "State", "State" = "State.y"))
compare_2019_1975$Adjusted.House.Prices = (compare_2019_1975$House.Prices/compare_2019_1975$CPI.Values) * 100
compare_2019_1975$State <- replace(compare_2019_1975$State, is.na(compare_2019_1975$State), "US Adjusted Avg.")
compare_2019_1975$Region <- replace(compare_2019_1975$Region, is.na(compare_2019_1975$Region), "US Adjusted Avg.")
compare_2019_1975
ggplot(data = compare_2019_1975) +
geom_point(aes(x = Period, y = Adjusted.House.Prices, color=State), size = 0.3, alpha=0.3) +
facet_grid(~ Year, shrink = TRUE) +
scale_color_discrete(guide = "none") +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All States") +
xlab("Time Period (Years)") + ylab("Adjusted House Prices") +
labs(subtitle = "General trends in house prices (adjusted for inflation) for all states") +
theme(strip.text = element_text(angle = 90, hjust = 0.5, size = 7), axis.text.x = element_blank(), panel.spacing = unit(0.0, "lines"))

grouped_year <-
data.frame(compare_2019_1975 %>%
dplyr::group_by(Year, Code, Region, State) %>%
dplyr::summarise(Average.House.Prices = mean(Adjusted.House.Prices), .groups = "keep"))
grouped_year
Density.census <- Density.census %>%
inner_join(grouped_year %>% select(-Code, -Region), by = join_by(Year == Year, State == State))
Density.census
P.1975 <- Density.census %>%
filter(Year == 1975) %>%
select(State, Average.House.Prices) %>%
dplyr::rename("hp1975" = "Average.House.Prices")
Density.census <- Density.census %>%
left_join(P.1975, by = join_by(State == State))
Density.census
Density.census$Price_Diff = Density.census$Average.House.Prices - Density.census$hp1975
Density.census$Price_Ratio = Density.census$Average.House.Prices / Density.census$hp1975
Density.census <- Density.census %>% select(-hp1975)
Density.census
ggplot(data = grouped_year %>% filter(State != 'District of Columbia')) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, color = 'darkgrey', linewidth = 0.4, aes(x = Year, y = Average.House.Prices)) +
geom_line(stat = 'identity', aes(x = Year, y = Average.House.Prices, color = Region)) +
facet_wrap(~State, ncol = 10) +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All States") +
xlab("Time Period (Years)") + ylab("Adjusted Average House Prices") +
labs(subtitle = "Trends in house prices (adjusted for inflation) faceted by state") +
theme(strip.text = element_text(size = 8), axis.text.x = element_blank(), axis.text.y = element_blank(), panel.spacing = unit(0.1, "lines"))

temp <- grouped_year %>%
filter(Year == 1975) %>%
select(State, Average.House.Prices) %>%
dplyr::rename('1975.Prices' = 'Average.House.Prices')
gy <- left_join(grouped_year, temp, by = join_by(State == State))
gy
ggplot(data = gy %>% filter(State != "District of Columbia"), aes(x = Year, y = Average.House.Prices - `1975.Prices`)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, color = 'darkgrey', linetype = "dashed", linewidth = 1) +
geom_line(stat = 'identity', aes(color = State)) +
geom_hline(yintercept = 0, color = 'black') +
facet_wrap(~Region, ncol = 1) +
scale_color_discrete(guide = "none") +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All States") +
xlab("Time Period (Years)") + ylab("Difference in House Prices") +
labs(subtitle = "Differences in house prices (adjusted for inflation) from 1975 for all states faceted by region") +
theme(strip.text = element_text(size = 6), axis.text.x = element_blank(), panel.spacing = unit(0.1, "lines"))

ggplot(data = grouped_year %>% filter(State != "District of Columbia"), aes(x = Year, y = Average.House.Prices)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, color = 'darkgrey', linetype = "dashed", linewidth = 1) +
geom_line(stat = 'identity', aes(color = State)) +
facet_wrap(~Region, ncol = 1) +
scale_color_discrete(guide = "none") +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All States") +
xlab("Time Period (Years)") + ylab("Adjusted Average House Prices") +
labs(subtitle = "Trends in house prices (adjusted for inflation) for all states faceted by region") +
theme(strip.text = element_text(size = 6), axis.text.x = element_blank(), panel.spacing = unit(0.1, "lines"))

grouped_region <-
data.frame(compare_2019_1975 %>% filter(State != "District of Columbia") %>%
dplyr::group_by(Year, Region) %>%
dplyr::summarise(Average.House.Prices = mean(Adjusted.House.Prices), .groups = "keep"))
grouped_region
ggplot(data = grouped_region, aes(x = Year, y = Average.House.Prices, color=Region)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, color = 'darkgrey', linetype = "dashed", linewidth = 1) +
geom_line(stat = "identity", alpha=0.6) +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All Regions") +
xlab("Time Period (Years)") + ylab("Adjusted Average House Prices") +
labs(subtitle = "Trends in average house prices (adjusted for inflation) grouped by region") +
theme(strip.text = element_text(angle = 45, hjust = 0.5, size = 6), panel.spacing = unit(0.0, "lines"))

grouped_region_t <-
data.frame(gy %>% filter(State != "District of Columbia") %>%
dplyr::group_by(Year, Region) %>%
dplyr::summarise(Average.House.Prices = mean(Average.House.Prices), Prices.1975 = mean(`1975.Prices`), .groups = "keep"))
grouped_region_t
ggplot(data = grouped_region_t, aes(x = Year, y = Average.House.Prices - Prices.1975, color=Region)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, color = 'darkgrey', linetype = "dashed", linewidth = 1) +
geom_hline(yintercept = 0, color = 'black') +
geom_line(stat = "identity", alpha=0.6) +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All Regions") +
xlab("Time Period (Years)") + ylab("Difference in House Prices") +
labs(subtitle = "DIference in average house prices from 1975 to 2019 grouped by region") +
theme(strip.text = element_text(angle = 45, hjust = 0.5, size = 6), panel.spacing = unit(0.0, "lines"))

grouped_region_wide <-
grouped_region %>%
pivot_wider(names_from = Year, values_from = Average.House.Prices)
grouped_region_wide$Price.Difference = grouped_region_wide$'2019' - grouped_region_wide$'1975'
grouped_region_wide <-
grouped_region_wide %>%
arrange(Price.Difference)
grouped_region_wide
ggplot(data = grouped_region_wide %>% filter(Region != "US Adjusted Avg."), aes(x = Region, y = Price.Difference, fill=Region)) +
geom_bar(stat = "identity", alpha=0.6) +
theme_classic() +
ggtitle("House Prices (1975 - 2019) for All Regions") +
xlab("Region") + ylab("Price Difference") +
labs(subtitle = "Difference in average house prices for each region from 1975 to 2019")

grouped_year_wide <-
grouped_year %>%
pivot_wider(names_from = Year, values_from = Average.House.Prices)
grouped_year_wide$Price.Difference = grouped_year_wide$'2019' - grouped_year_wide$'1975'
grouped_year_wide <-
grouped_year_wide %>%
arrange(Price.Difference) %>%
filter(State != 'District of Columbia')
grouped_year_wide
most_price_increase <- tail(grouped_year_wide, 10)
most_price_drop <- head(grouped_year_wide, 10)
most_price_increase$var = "Price Increase"
most_price_drop$var = "Price Decrease"
price_change = rbind(head(most_price_drop, 5), tail(most_price_increase, 5))
price_change
bp1 <- ggplot(data = head(most_price_drop, 5), aes(x = State, y = Price.Difference)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(Price.Difference, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Price Change") +
xlab("State") + ylab("Price Difference") +
labs(subtitle = "States with the lowest (most negative) price change between 1975 and 2019")
bp2 <- ggplot(data = tail(most_price_increase, 5), aes(x = State, y = Price.Difference)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(Price.Difference, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Price Change") +
xlab("State") + ylab("Price Difference") +
labs(subtitle = "States with the highest (most positive) price change between 1975 and 2019")
grid.arrange(bp1, bp2, ncol = 2)

Question - 2
Combined.2019 <- Census.2019 %>%
inner_join(Density.2019, by = join_by(State == State)) %>%
inner_join(grouped_year %>% filter(Year == 2019) %>% select(State, Average.House.Prices), by = join_by(State == State))
Combined.2019$Year = 2019
Combined.2019 <- Combined.2019 %>%
filter(State != 'District of Columbia')
Combined.2019
Combined <-
Combined.2019 %>%
dplyr::rename("Population.2019" = "Population", "Density.2019" = "Density", "Prices.2019" = "Average.House.Prices") %>%
inner_join(Combined.1975, by = join_by(State == State)) %>%
inner_join(grouped_year %>% filter(Year == 1975) %>% select(State, Average.House.Prices), by = join_by(State == State)) %>%
dplyr::rename("Population.1975" = "Population", "Density.1975" = "Density", "Prices.1975" = "Average.House.Prices") %>%
select(-Year.x, -Year.y) %>%
inner_join(State.Region.Details, by = join_by(State == State))
Combined$Price.Diff = Combined$Prices.2019 - Combined$Prices.1975
Combined$Density.Diff = Combined$Density.2019 - Combined$Density.1975
Combined$Population.Diff = Combined$Population.2019 - Combined$Population.1975
Combined
a <- grouped_year %>%
filter(Year == 1975) %>%
select(Year, State, Average.House.Prices) %>%
inner_join(Combined.1975 %>% select(-Year), by = join_by(State == State))
b <-
Combined.2019 %>%
select(Year, State, Average.House.Prices, Population, Density)
Combined_long <- rbind(a, b) %>%
filter(State != "District of Columbia") %>%
dplyr::rename("Price" = "Average.House.Prices") %>%
mutate_at("Year", as.character) %>%
inner_join(State.Region.Details, by = join_by(State == State))
Combined_long
ggplot(data = Combined, aes(x = Density.Diff, y = Price.Diff, size = Population.Diff, color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), nudge_x = 0.1, nudge_y = 0.1, size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("Trend Between Density and House Prices") +
xlab("Difference in Density") + ylab("Price Difference") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in densities and the change in house prices between 1975 and 2019")

ggplot(data = Combined, aes(x = Density.Diff, y = Price.Diff, size = Population.Diff, color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), nudge_x = 0.1, nudge_y = 0.1, size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("Trend Between Density and House Prices") +
xlab("Difference in Density") + ylab("Price Difference") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in densities and the change in house prices between 1975 and 2019 for each region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

ggplot(data = Combined, aes(x = log((Density.2019/Density.1975)), y = log((Prices.2019/Prices.1975)), size = (Population.2019/Population.1975), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), nudge_x = 0.01, nudge_y = 0.01, size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("Trend Between Density and House Prices") +
xlab("Proportion of Density (log scale)") + ylab("Proportion of Price (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the proportional change in densities and the proportional change in house prices between 1975 and 2019")

ggplot(data = Combined, aes(x = log((Density.2019/Density.1975)), y = log((Prices.2019/Prices.1975)), size = (Population.2019/Population.1975), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), nudge_x = 0.1, nudge_y = 0.1, size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("Trend Between Density and House Prices") +
xlab("Proportion of Density (log scale)") + ylab("Proportion of Price (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the proportional change in densities and the proportional change in house prices between 1975 and 2019 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

ggplot(data = Density.census %>% filter(Year != 1975), aes(x = log(Density_Ratio), y = log(Price_Ratio), color = Code, )) +
geom_point(alpha = 0.4) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', color = 'black', se = FALSE, linewidth = 0.6) +
#geom_label_repel(aes(label = Code, color = Code), size = 2, max.overlaps = 50) +
scale_color_discrete(guide = "none") +
facet_grid(Region~Year) +
theme_bw() +
ggtitle("Trend Between Density and House Prices") +
xlab("Proportion of Density (log scale)") + ylab("Proportion of Price (log scale)") +
labs(subtitle = "Proportional change in densities and the proportional change in house prices between 1975 and 2019 faceted by region and year") +
theme(panel.grid = element_blank())

ggplot(data = Density.census, aes(x = Density, y = Average.House.Prices, color = Region)) +
geom_point(alpha = 0.4) +
#geom_hline(yintercept = 1, color = 'darkgray', linetype = 'dashed', linewidth = 0.4) +
#geom_vline(xintercept = 1, color = 'darkgray', linetype = 'dashed', linewidth = 0.4) +
geom_smooth(method = 'lm', color = 'black', se = FALSE, linewidth = 0.6) +
#geom_label_repel(aes(label = Code, color = Code), size = 2, max.overlaps = 50) +
#scale_color_discrete(guide = "none") +
facet_grid(~Year) +
theme_bw() +
ggtitle("Trend Between Density and House Prices") +
xlab("Population Density") + ylab("Average House Prices") +
labs(subtitle = "Proportional change in densities and the proportional change in house prices across decades between 1975 and 2019 faceted by region") +
theme(panel.grid = element_blank())

ggplot(data = Density.census, aes(x = Year, y = log(Price_Ratio), color = log(Density_Ratio))) +
geom_line(linewidth = 1) +
scale_color_distiller(name = 'Proportion of Density', palette = "YlOrRd") +
facet_wrap(~State, nrow = 5) +
theme_bw() +
ggtitle("Trend Between Density and House Prices") +
xlab("Years") + ylab("Proportion of Price (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the proportional change in densities and the proportional change in house prices between 1975 and 2019 faceted by region") +
theme(panel.grid = element_blank(), axis.text.x = element_text(hjust = 1, angle = 45))

Question - 3
Year Range - 1990 to 2000
a1 <-
rbind(
(grouped_year %>%
filter(Year == 1990) %>%
inner_join(Census.1990, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2000) %>%
inner_join(Census.2000, by = join_by(State == State)))) %>%
select(-Average.House.Prices) %>%
pivot_wider(names_from = Year, values_from = Population) %>%
dplyr::rename("Population.1990" = "1990", "Population.2000" = "2000")
b1 <-
rbind(
(grouped_year %>%
filter(Year == 1990) %>%
inner_join(Census.1990, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2000) %>%
inner_join(Census.2000, by = join_by(State == State)))) %>%
select(-Population) %>%
pivot_wider(names_from = Year, values_from = Average.House.Prices) %>%
dplyr::rename("Average.House.Price.1990" = "1990", "Average.House.Price.2000" = "2000")
Values.1990.2000 <-
a1 %>%
inner_join(b1, by = join_by(State)) %>%
select(-Code.y, -Region.y) %>%
dplyr::rename("Code" = "Code.x", "Region" = "Region.x") %>%
filter(State != "District of Columbia")
Values.1990.2000
Values.1990.2000 <-
Values.1990.2000 %>%
arrange(Average.House.Price.2000 - Average.House.Price.1990)
bp3 <- ggplot(data = head(Values.1990.2000, 5), aes(x = State, y = ((Average.House.Price.2000 - Average.House.Price.1990)/Average.House.Price.1990)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2000 - Average.House.Price.1990)/Average.House.Price.1990)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the lowest percentage price change between 1990 and 2000")
bp4 <- ggplot(data = tail(Values.1990.2000, 5), aes(x = State, y = ((Average.House.Price.2000 - Average.House.Price.1990)/Average.House.Price.1990)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2000 - Average.House.Price.1990)/Average.House.Price.1990)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage price change between 1990 and 2000")
grid.arrange(bp3, bp4, ncol = 2)

Values.1990.2000 <-
Values.1990.2000 %>%
arrange(Population.2000 - Population.1990)
bp5 <- ggplot(data = head(Values.1990.2000, 5), aes(x = State, y = ((Population.2000 - Population.1990)/Population.1990)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2000 - Population.1990)/Population.1990)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Population Change") +
xlab("State") + ylab("Population Difference %") +
labs(subtitle = "States with the lowest percentage population change between 1990 and 2000")
bp6 <- ggplot(data = tail(Values.1990.2000, 5), aes(x = State, y = ((Population.2000 - Population.1990)/Population.1990)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2000 - Population.1990)/Population.1990)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Population Change") +
xlab("State") + ylab("Population Difference %") +
labs(subtitle = "States with the highest percentage population change between 1990 and 2000")
grid.arrange(bp5, bp6, ncol = 2)

ggplot(data = Values.1990.2000, aes(x = (Population.2000 - Population.1990), y = (Average.House.Price.2000 - Average.House.Price.1990), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("(1990 and 2000) Trend Between Population and House Prices") +
xlab("Difference in Price") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 1990 and 2000")

ggplot(data = Values.1990.2000, aes(x = (Population.2000 - Population.1990), y = (Average.House.Price.2000 - Average.House.Price.1990), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(1990 and 2000) Trend Between Population and House Prices") +
xlab("Difference in Price") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 1990 and 2000 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

ggplot(data = Values.1990.2000, aes(x = log((Population.2000 / Population.1990)), y = log((Average.House.Price.2000 / Average.House.Price.1990)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("(1990 and 2000) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 1990 and 2000")

ggplot(data = Values.1990.2000, aes(x = log((Population.2000 / Population.1990)), y = log((Average.House.Price.2000 / Average.House.Price.1990)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 50) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(1990 and 2000) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 1990 and 2000 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

Year Range - 2000 to 2010
a2 <-
rbind(
(grouped_year %>%
filter(Year == 2000) %>%
inner_join(Census.2000, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2010) %>%
inner_join(Census.2010, by = join_by(State == State)))) %>%
select(-Average.House.Prices) %>%
pivot_wider(names_from = Year, values_from = Population) %>%
dplyr::rename("Population.2000" = "2000", "Population.2010" = "2010")
b2 <-
rbind(
(grouped_year %>%
filter(Year == 2000) %>%
inner_join(Census.2010, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2010) %>%
inner_join(Census.2010, by = join_by(State == State)))) %>%
select(-Population) %>%
pivot_wider(names_from = Year, values_from = Average.House.Prices) %>%
dplyr::rename("Average.House.Price.2000" = "2000", "Average.House.Price.2010" = "2010")
Values.2000.2010 <-
a2 %>%
inner_join(b2, by = join_by(State)) %>%
select(-Code.y, -Region.y) %>%
dplyr::rename("Code" = "Code.x", "Region" = "Region.x") %>%
filter(State != "District of Columbia")
Values.2000.2010
Values.2000.2010 <-
Values.2000.2010 %>%
arrange(Average.House.Price.2010 - Average.House.Price.2000)
bp7 <- ggplot(data = head(Values.2000.2010, 5), aes(x = State, y = ((Average.House.Price.2010 - Average.House.Price.2000)/Average.House.Price.2000)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2010 - Average.House.Price.2000)/Average.House.Price.2000)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the lowest percentage price change between 2000 and 2010")
bp8 <- ggplot(data = tail(Values.2000.2010, 5), aes(x = State, y = ((Average.House.Price.2010 - Average.House.Price.2000)/Average.House.Price.2000)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2010 - Average.House.Price.2000)/Average.House.Price.2000)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage price change between 2000 and 2010")
grid.arrange(bp7, bp8, ncol = 2)

Values.2000.2010 <-
Values.2000.2010 %>%
arrange(Population.2010 - Population.2000)
bp9 <- ggplot(data = head(Values.2000.2010, 5), aes(x = State, y = ((Population.2010 - Population.2000)/Population.2000)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2010 - Population.2000)/Population.2000)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Population Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the lowest percentage population change between 2000 and 2010")
bp10 <- ggplot(data = tail(Values.2000.2010, 5), aes(x = State, y = ((Population.2010 - Population.2000)/Population.2000)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2010 - Population.2000)/Population.2000)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Population Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage population change between 2000 and 2010")
grid.arrange(bp9, bp10, ncol = 2)

ggplot(data = Values.2000.2010, aes(x = (Population.2010 - Population.2000), y = (Average.House.Price.2010 - Average.House.Price.2000), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("(2000 and 2010) Trend Between Population and House Prices") +
xlab("Difference in Population") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 2000 and 2010")

ggplot(data = Values.2000.2010, aes(x = (Population.2010 - Population.2000), y = (Average.House.Price.2010 - Average.House.Price.2000), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(2000 and 2010) Trend Between Population and House Prices") +
xlab("Difference in Population") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 2000 and 2010 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

ggplot(data = Values.2000.2010, aes(x = log((Population.2010 / Population.2000)), y = log((Average.House.Price.2010 / Average.House.Price.2000)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("(2000 and 2010) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 2000 and 2010")

ggplot(data = Values.2000.2010, aes(x = log((Population.2010 / Population.2000)), y = log((Average.House.Price.2010 / Average.House.Price.2000)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(2000 and 2010) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 2000 and 2010 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

Year Range - 2010 to 2019
a3 <-
rbind(
(grouped_year %>%
filter(Year == 2010) %>%
inner_join(Census.2010, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2019) %>%
inner_join(Census.2019, by = join_by(State == State)))) %>%
select(-Average.House.Prices) %>%
pivot_wider(names_from = Year, values_from = Population) %>%
dplyr::rename("Population.2010" = "2010", "Population.2019" = "2019")
b3 <-
rbind(
(grouped_year %>%
filter(Year == 2010) %>%
inner_join(Census.2010, by = join_by(State == State))),
(grouped_year %>%
filter(Year == 2019) %>%
inner_join(Census.2019, by = join_by(State == State)))) %>%
select(-Population) %>%
pivot_wider(names_from = Year, values_from = Average.House.Prices) %>%
dplyr::rename("Average.House.Price.2010" = "2010", "Average.House.Price.2019" = "2019")
Values.2010.2019 <-
a3 %>%
inner_join(b3, by = join_by(State)) %>%
select(-Code.y, -Region.y) %>%
dplyr::rename("Code" = "Code.x", "Region" = "Region.x") %>%
filter(State != "District of Columbia")
Values.2010.2019
Values.2010.2019 <-
Values.2010.2019 %>%
arrange(Average.House.Price.2019 - Average.House.Price.2010)
bp11 <- ggplot(data = head(Values.2010.2019, 5), aes(x = State, y = ((Average.House.Price.2019 - Average.House.Price.2010)/Average.House.Price.2010)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2019 - Average.House.Price.2010)/Average.House.Price.2010)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the lowest percentage price change between 2010 and 2019")
bp12 <- ggplot(data = tail(Values.2010.2019, 5), aes(x = State, y = ((Average.House.Price.2019 - Average.House.Price.2010)/Average.House.Price.2010)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Average.House.Price.2019 - Average.House.Price.2010)/Average.House.Price.2010)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Price Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage price change between 2010 and 2019")
grid.arrange(bp11, bp12, ncol = 2)

Values.2010.2019 <-
Values.2010.2019 %>%
arrange(Population.2019 - Population.2010)
bp13 <- ggplot(data = head(Values.2010.2019, 5), aes(x = State, y = ((Population.2019 - Population.2010)/Population.2010)*100)) +
geom_bar(stat = "identity", fill = "darkblue", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2019 - Population.2010)/Population.2010)*100, 2)), nudge_x = -0.1, size = 3) +
theme_classic() +
ggtitle("Least Population Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage population change between 2010 and 2019")
bp14 <- ggplot(data = tail(Values.2010.2019, 5), aes(x = State, y = ((Population.2019 - Population.2010)/Population.2010)*100)) +
geom_bar(stat = "identity", fill = "darkgreen", alpha = 0.7) +
geom_label_repel(aes(label = round(((Population.2019 - Population.2010)/Population.2010)*100, 2)), nudge_x = 0.1, size = 3) +
theme_classic() +
ggtitle("Most Population Change") +
xlab("State") + ylab("Price Difference %") +
labs(subtitle = "States with the highest percentage population change between 2010 and 2019")
grid.arrange(bp13, bp14, ncol = 2)

ggplot(data = Values.2010.2019, aes(x = (Population.2019 - Population.2010), y = (Average.House.Price.2019 - Average.House.Price.2010), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
theme_classic() +
ggtitle("(2010 and 2019) Trend Between Population and House Prices") +
xlab("Difference in Population") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 2010 and 2019")

ggplot(data = Values.2010.2019, aes(x = (Population.2019 - Population.2010), y = (Average.House.Price.2019 - Average.House.Price.2010), color = State)) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 20) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(2010 and 2019) Trend Between Population and House Prices") +
xlab("Difference in Population") + ylab("Difference in House Prices") +
labs(subtitle = "Scatterplot explaining the relationship between the difference in population and the difference in house prices between 2010 and 2019 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

ggplot(data = Values.2010.2019, aes(x = log((Population.2019 / Population.2010)), y = log((Average.House.Price.2019 / Average.House.Price.2010)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 30) +
theme_classic() +
ggtitle("(2010 and 2019) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 2010 and 2019")

ggplot(data = Values.2010.2019, aes(x = log((Population.2019 / Population.2010)), y = log((Average.House.Price.2019 / Average.House.Price.2010)), color = State)) +
geom_hline(yintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_vline(xintercept = 0, color = 'black', linetype = 'dotted', linewidth = 0.4) +
geom_smooth(method = 'lm', formula = y~x, color = 'darkgrey', alpha = 0.4, linetype = 'dashed', linewidth = 1, se = FALSE) +
geom_point(alpha = 0.5) +
scale_size_continuous(guide = "none") +
scale_color_discrete(guide = "none") +
geom_label_repel(aes(label = Code), size = 2, max.overlaps = 30) +
facet_wrap(~Region, nrow = 2) +
theme_classic() +
ggtitle("(2010 and 2019) Trend Between Population and House Prices") +
xlab("Proportion of Population (log scale)") + ylab("Proportion of House Prices (log scale)") +
labs(subtitle = "Scatterplot explaining the relationship between the ratio of population and the ratio of house prices between 2010 and 2019 faceted by region") +
theme(strip.text = element_text(size = 8), panel.spacing = unit(1, "lines"))

LS0tCnRpdGxlOiAiTWluaSBQcm9qZWN0IC0gU2FpIFRlamEgQnVybGEgLSBUZWFtIFZlcm1vbnQgOikiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIyBJbXBvcnRpbmcgTGlicmFyaWVzCgpgYGB7cn0KbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiZ3JpZEV4dHJhIikKbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoImdncmlkZ2VzIikKbGlicmFyeSgidGlkeXIiKQpsaWJyYXJ5KCJyZWFkeGwiKQpsaWJyYXJ5KCJzdHJpbmdyIikKbGlicmFyeSgiZ2dyZXBlbCIpCmxpYnJhcnkoImdyaWRFeHRyYSIpCmxpYnJhcnkoInBhdGNod29yayIpCmxpYnJhcnkoInZpcmlkaXMiKQpsaWJyYXJ5KCJicm9vbSIpCmBgYAoKIyMjIEltcG9ydGluZyBIb3VzZSBQcmljZSBJbmRleCBEYXRhIGFuZCBQZXJmb3JtIHNvbWUgUHJlcHJvY2Vzc2luZyAKCmBgYHtyfQpIb3VzZS5QcmljZS5JbmRleCA8LSByZWFkX2V4Y2VsKCJTdGF0ZV9hbmRfVVNfU0EueGxzIiwgc2tpcCA9IDUpCkhvdXNlLlByaWNlLkluZGV4IDwtIGhlYWQoSG91c2UuUHJpY2UuSW5kZXgsIC0gMTYpIApIb3VzZS5QcmljZS5JbmRleCA8LSAKICBkYXRhLmZyYW1lKEhvdXNlLlByaWNlLkluZGV4ICU+JSAKICBkcGx5cjo6cmVuYW1lKCJEYXRlIiA9ICJNb250aCIpICU+JSAKICBzZXBhcmF0ZV93aWRlcl9wb3NpdGlvbigiRGF0ZSIsIGMoIlllYXIiID0gNCwgIlBlcmlvZCIgPSAzKSkgJT4lCiAgbXV0YXRlX2F0KCJZZWFyIiwgYXMuaW50ZWdlcikgJT4lCiAgbXV0YXRlX2F0KCJBSyIsIGFzLmRvdWJsZSkpICU+JSAKICBzZWxlY3QoLVVuaXRlZC5TdGF0ZXMuc2Vhc29uYWxseS5hZGp1c3RlZCkKSG91c2UuUHJpY2UuSW5kZXgKYGBgCgojIyMgSW1wb3J0aW5nIFN0YXRlIFJlZ2lvbiBEZXRhaWxzCgpgYGB7cn0KU3RhdGUuUmVnaW9uLkRldGFpbHMgPC0gcmVhZC50YWJsZSgic3RhdGVfYWJicmV2cy50eHQiLCBzZXAgPSAiICIsIGhlYWRlciA9IFRSVUUpClN0YXRlLlJlZ2lvbi5EZXRhaWxzCmBgYAoKIyMjIEltcG9ydGluZyBDb25zdW1lciBQcmljZSBJbmRleCBEYXRhCgpgYGB7cn0KQ29uc3VtZXIuUHJpY2UuSW5kZXggPC0gcmVhZC5jc3YoImNwaS5jc3YiLCBoZWFkZXIgPSBUUlVFKSAlPiUgc2VsZWN0KC1TZXJpZXMuSUQsIC1MYWJlbCkKQ29uc3VtZXIuUHJpY2UuSW5kZXgKYGBgCgoKYGBge3J9CkNlbnN1cyA8LSByZWFkLmNzdigiY29tYmluZWRjZW5zdXNwb3AuY3N2IiwgaGVhZGVyID0gVFJVRSkgJT4lCiAgc2VsZWN0KC1HSVNKT0lOLCAtU1RBVEVGUCwgLVNUQVRFTkgsIC1OQU1FKSAlPiUKICBmaWx0ZXIoWUVBUiA+PSAxOTc1ICYgWUVBUiA8PSAyMDE5KSAlPiUKICBmaWx0ZXIoU1RBVEUgIT0gJ1B1ZXJ0byBSaWNvJykgJT4lCiAgZmlsdGVyKFNUQVRFICE9ICdEaXN0cmljdCBvZiBDb2x1bWJpYScpICU+JQogIGRwbHlyOjpyZW5hbWUoIlN0YXRlIiA9ICJTVEFURSIsICJQb3B1bGF0aW9uIiA9ICJBMDBBQSIsICJZZWFyIiA9ICJZRUFSIikKQ2Vuc3VzCmBgYAoKCiMjIyBJbXBvcnRpbmcgQ2Vuc3VzIERhdGEgZm9yIHRoZSBZZWFyIDE5OTAKCmBgYHtyfQpDZW5zdXMuMTk5MCA8LSByZWFkLmNzdigiY29tYmluZWRjZW5zdXNwb3AuY3N2IiwgaGVhZGVyID0gVFJVRSkgJT4lIAogIGZpbHRlcihZRUFSID09IDE5OTApICU+JSAKICBzZWxlY3QoLUdJU0pPSU4sIC1ZRUFSLCAtU1RBVEVGUCwgLVNUQVRFTkgsIC1OQU1FKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJTdGF0ZSIgPSAiU1RBVEUiLCAiUG9wdWxhdGlvbiIgPSAiQTAwQUEiKQpDZW5zdXMuMTk5MApgYGAKCiMjIyBJbXBvcnRpbmcgQ2Vuc3VzIERhdGEgZm9yIHRoZSBZZWFyIDIwMDAKCmBgYHtyfQpDZW5zdXMuMjAwMCA8LSByZWFkLmNzdigiY29tYmluZWRjZW5zdXNwb3AuY3N2IiwgaGVhZGVyID0gVFJVRSkgJT4lIAogIGZpbHRlcihZRUFSID09IDIwMDApICU+JSAKICBzZWxlY3QoLUdJU0pPSU4sIC1ZRUFSLCAtU1RBVEVGUCwgLVNUQVRFTkgsIC1OQU1FKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJTdGF0ZSIgPSAiU1RBVEUiLCAiUG9wdWxhdGlvbiIgPSAiQTAwQUEiKQpDZW5zdXMuMjAwMApgYGAKCiMjIyBJbXBvcnRpbmcgQ2Vuc3VzIERhdGEgZm9yIHRoZSBZZWFyIDIwMTAKCmBgYHtyfQpDZW5zdXMuMjAxMCA8LSByZWFkLmNzdigiY29tYmluZWRjZW5zdXNwb3AuY3N2IiwgaGVhZGVyID0gVFJVRSkgJT4lIAogIGZpbHRlcihZRUFSID09IDIwMTApICU+JSAKICBzZWxlY3QoLUdJU0pPSU4sIC1ZRUFSLCAtU1RBVEVGUCwgLVNUQVRFTkgsIC1OQU1FKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJTdGF0ZSIgPSAiU1RBVEUiLCAiUG9wdWxhdGlvbiIgPSAiQTAwQUEiKQpDZW5zdXMuMjAxMApgYGAKCiMjIyBJbXBvcnRpbmcgQ2Vuc3VzIERhdGEgZm9yIHRoZSBZZWFyIDIwMTkKCmBgYHtyfQpDZW5zdXMuMjAxOSA8LSByZWFkLnRhYmxlKCJjZW5zdXNwb3AyMDE5LnR4dCIsIHNlcCA9ICIgIiwgaGVhZGVyID0gVFJVRSkgJT4lIAogIGZpbHRlcih2YXJpYWJsZSA9PSAiUE9QIikgJT4lIAogIHNlbGVjdCgtR0VPSUQsIC12YXJpYWJsZSkgJT4lCiAgZHBseXI6OnJlbmFtZSgiU3RhdGUiID0gIk5BTUUiLCAiUG9wdWxhdGlvbiIgPSAidmFsdWUiKQpDZW5zdXMuMjAxOSA8LSBoZWFkKENlbnN1cy4yMDE5LCA1MSkKQ2Vuc3VzLjIwMTkKYGBgCgojIyMgSW1wb3J0aW5nIERlbnNpdHkgRGF0YSBmb3IgdGhlIFllYXIgMjAxOQoKYGBge3J9CkRlbnNpdHkuMjAxOSA8LSByZWFkLnRhYmxlKCJjZW5zdXNwb3AyMDE5LnR4dCIsIHNlcCA9ICIgIiwgaGVhZGVyID0gVFJVRSkgJT4lIAogIGZpbHRlcih2YXJpYWJsZSA9PSAiREVOU0lUWSIpICU+JSAKICBzZWxlY3QoLUdFT0lELCAtdmFyaWFibGUpICU+JQogIGRwbHlyOjpyZW5hbWUoIlN0YXRlIiA9ICJOQU1FIiwgIkRlbnNpdHkiID0gInZhbHVlIikgCkRlbnNpdHkuMjAxOSA8LSBoZWFkKERlbnNpdHkuMjAxOSwgNTEpCkRlbnNpdHkuMjAxOSREZW5zaXR5ID0gcm91bmQoRGVuc2l0eS4yMDE5JERlbnNpdHksIDIpCkRlbnNpdHkuMjAxOQpgYGAKCmBgYHtyfQpDb21iaW5lZC4yMDE5IDwtIENlbnN1cy4yMDE5ICU+JSAKICBpbm5lcl9qb2luKERlbnNpdHkuMjAxOSwgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkKQ29tYmluZWQuMjAxOQpgYGAKCgojIyMgSW1wb3J0aW5nIERhdGEgZm9yIHRoZSBZZWFyIDE5NzUKCmBgYHtyfQpDb21iaW5lZC4xOTc1IDwtIHJlYWQuY3N2KCJEZW5zaXR5MTk3NSAtIERlbnNpdHkxOTc1LmNzdiIsIGhlYWRlciA9IFRSVUUpICMlPiUgZHBseXI6OnJlbmFtZSgiUG9wdWxhdGlvbi4xOTc1IiA9ICJQb3B1bGF0aW9uIiwgIkRlbnNpdHkuMTk3NSIgPSAiRGVuc2l0eSIpCkNvbWJpbmVkLjE5NzUkRGVuc2l0eSA9IHJvdW5kKChDb21iaW5lZC4xOTc1JERlbnNpdHkgKiAxMDAuMDEpIC8gOTkuOSwgMikKQ29tYmluZWQuMTk3NQpgYGAKCmBgYHtyfQpDZW5zdXMuMTk3NSA8LSBDb21iaW5lZC4xOTc1ICU+JSBzZWxlY3QoLURlbnNpdHkpCkNlbnN1cy4xOTc1CmBgYAoKCiMjIyBDYWxjdWxhdGluZyBhcHByb3hpbWF0ZSBhcmVhcyBhbmQgcG9wdWxhdGlvbiBkZW5zaXRpZXMgZm9yIGludGVybWVkaWF0ZSB5ZWFycwoKYGBge3J9CkFwcHJveGltYXRlLkFyZWFzIDwtIENvbWJpbmVkLjIwMTkgJT4lIGZpbHRlcihTdGF0ZSAhPSAnRGlzdHJpY3Qgb2YgQ29sdW1iaWEnKQpBcHByb3hpbWF0ZS5BcmVhcyRBcmVhID0gcm91bmQoQXBwcm94aW1hdGUuQXJlYXMkUG9wdWxhdGlvbiAvIEFwcHJveGltYXRlLkFyZWFzJERlbnNpdHksIDIpCkFwcHJveGltYXRlLkFyZWFzIDwtIEFwcHJveGltYXRlLkFyZWFzICU+JSBzZWxlY3QoLVBvcHVsYXRpb24sIC1EZW5zaXR5KQpBcHByb3hpbWF0ZS5BcmVhcwpgYGAKCmBgYHtyfQpEZW5zaXR5LmNlbnN1cyA8LSAKICBsZWZ0X2pvaW4oQ2Vuc3VzLCBBcHByb3hpbWF0ZS5BcmVhcywgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkKRGVuc2l0eS5jZW5zdXMkRGVuc2l0eSA9IERlbnNpdHkuY2Vuc3VzJFBvcHVsYXRpb24gLyBEZW5zaXR5LmNlbnN1cyRBcmVhCkRlbnNpdHkuY2Vuc3VzIDwtIERlbnNpdHkuY2Vuc3VzICU+JQogIHNlbGVjdCgtQXJlYSkKRGVuc2l0eS5jZW5zdXMKYGBgCgpgYGB7cn0KQ29tYmluZWQuMTk3NSRZZWFyID0gYXMuaW50ZWdlcigxOTc1KQpDb21iaW5lZC4yMDE5JFllYXIgPSBhcy5pbnRlZ2VyKDIwMTkpCkRlbnNpdHkuY2Vuc3VzIDwtIHJiaW5kKENvbWJpbmVkLjE5NzUsIERlbnNpdHkuY2Vuc3VzLCBDb21iaW5lZC4yMDE5KQpEZW5zaXR5LmNlbnN1cyREZW5zaXR5IDwtIHJvdW5kKERlbnNpdHkuY2Vuc3VzJERlbnNpdHksIDIpCkRlbnNpdHkuY2Vuc3VzIDwtIERlbnNpdHkuY2Vuc3VzICU+JQogIGlubmVyX2pvaW4oQ29tYmluZWQuMTk3NSAlPiUgc2VsZWN0KC1ZZWFyKSwgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkKRGVuc2l0eS5jZW5zdXMKYGBgCgpgYGB7cn0KRGVuc2l0eS5jZW5zdXMgPC0gRGVuc2l0eS5jZW5zdXMgJT4lCiAgaW5uZXJfam9pbihTdGF0ZS5SZWdpb24uRGV0YWlscywgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkgJT4lCiAgZHBseXI6OnJlbmFtZSgiRGVuc2l0eSIgPSAiRGVuc2l0eS54IiwgIlBvcHVsYXRpb24iID0gIlBvcHVsYXRpb24ueCIpCkRlbnNpdHkuY2Vuc3VzCmBgYAoKYGBge3J9CkRlbnNpdHkuY2Vuc3VzJFBvcHVsYXRpb25fRGlmZiA9IERlbnNpdHkuY2Vuc3VzJFBvcHVsYXRpb24gLSBEZW5zaXR5LmNlbnN1cyRQb3B1bGF0aW9uLnkKRGVuc2l0eS5jZW5zdXMkUG9wdWxhdGlvbl9SYXRpbyA9IHJvdW5kKERlbnNpdHkuY2Vuc3VzJFBvcHVsYXRpb24gLyBEZW5zaXR5LmNlbnN1cyRQb3B1bGF0aW9uLnksIDIpCkRlbnNpdHkuY2Vuc3VzJERlbnNpdHlfRGlmZiA9IERlbnNpdHkuY2Vuc3VzJERlbnNpdHkgLSBEZW5zaXR5LmNlbnN1cyREZW5zaXR5LnkKRGVuc2l0eS5jZW5zdXMkRGVuc2l0eV9SYXRpbyA9IHJvdW5kKERlbnNpdHkuY2Vuc3VzJERlbnNpdHkgLyBEZW5zaXR5LmNlbnN1cyREZW5zaXR5LnksIDIpCkRlbnNpdHkuY2Vuc3VzCmBgYAoKYGBge3J9CkRlbnNpdHkuY2Vuc3VzIDwtCiAgRGVuc2l0eS5jZW5zdXMgJT4lCiAgc2VsZWN0KC1Qb3B1bGF0aW9uLnksIC1EZW5zaXR5LnkpCkRlbnNpdHkuY2Vuc3VzCmBgYAoKCiMjIFF1ZXN0aW9uIC0gMQoKYGBge3J9CmhvdXNlc19sb25nIDwtIGRhdGEuZnJhbWUoZ2F0aGVyKEhvdXNlLlByaWNlLkluZGV4LCBrZXk9IlN0YXRlIiwgdmFsdWU9IkhvdXNlLlByaWNlcyIsIDM6NTMpKQpIb3VzZV9QcmljZV9EYXRhIDwtIAogIGRhdGEuZnJhbWUoaG91c2VzX2xvbmcgJT4lCiAgaW5uZXJfam9pbihDb25zdW1lci5QcmljZS5JbmRleCwgYnkgPSBjKCJZZWFyIiwgIlBlcmlvZCIpKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJDUEkuVmFsdWVzIiA9ICJWYWx1ZSIpKQpIb3VzZV9QcmljZV9EYXRhCmBgYAoKYGBge3J9CmNvbXBhcmVfMjAxOV8xOTc1IDwtIAogIGRhdGEuZnJhbWUoSG91c2VfUHJpY2VfRGF0YSAlPiUKICBsZWZ0X2pvaW4oU3RhdGUuUmVnaW9uLkRldGFpbHMsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBDb2RlKSkgJT4lCiAgZHBseXI6OnJlbmFtZSgiQ29kZSIgPSAiU3RhdGUiLCAiU3RhdGUiID0gIlN0YXRlLnkiKSkKY29tcGFyZV8yMDE5XzE5NzUkQWRqdXN0ZWQuSG91c2UuUHJpY2VzID0gKGNvbXBhcmVfMjAxOV8xOTc1JEhvdXNlLlByaWNlcy9jb21wYXJlXzIwMTlfMTk3NSRDUEkuVmFsdWVzKSAqIDEwMApjb21wYXJlXzIwMTlfMTk3NSRTdGF0ZSA8LSByZXBsYWNlKGNvbXBhcmVfMjAxOV8xOTc1JFN0YXRlLCBpcy5uYShjb21wYXJlXzIwMTlfMTk3NSRTdGF0ZSksICJVUyBBZGp1c3RlZCBBdmcuIikKY29tcGFyZV8yMDE5XzE5NzUkUmVnaW9uIDwtIHJlcGxhY2UoY29tcGFyZV8yMDE5XzE5NzUkUmVnaW9uLCBpcy5uYShjb21wYXJlXzIwMTlfMTk3NSRSZWdpb24pLCAiVVMgQWRqdXN0ZWQgQXZnLiIpCmNvbXBhcmVfMjAxOV8xOTc1CmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEyfQpnZ3Bsb3QoZGF0YSA9IGNvbXBhcmVfMjAxOV8xOTc1KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFBlcmlvZCwgeSA9IEFkanVzdGVkLkhvdXNlLlByaWNlcywgY29sb3I9U3RhdGUpLCBzaXplID0gMC4zLCBhbHBoYT0wLjMpICsKICBmYWNldF9ncmlkKH4gWWVhciwgc2hyaW5rID0gVFJVRSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJIb3VzZSBQcmljZXMgKDE5NzUgLSAyMDE5KSBmb3IgQWxsIFN0YXRlcyIpICsKICB4bGFiKCJUaW1lIFBlcmlvZCAoWWVhcnMpIikgKyB5bGFiKCJBZGp1c3RlZCBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJHZW5lcmFsIHRyZW5kcyBpbiBob3VzZSBwcmljZXMgKGFkanVzdGVkIGZvciBpbmZsYXRpb24pIGZvciBhbGwgc3RhdGVzIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAwLjUsIHNpemUgPSA3KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuMCwgImxpbmVzIikpIApgYGAKCmBgYHtyfQpncm91cGVkX3llYXIgPC0KICBkYXRhLmZyYW1lKGNvbXBhcmVfMjAxOV8xOTc1ICU+JQogIGRwbHlyOjpncm91cF9ieShZZWFyLCBDb2RlLCBSZWdpb24sIFN0YXRlKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKEF2ZXJhZ2UuSG91c2UuUHJpY2VzID0gbWVhbihBZGp1c3RlZC5Ib3VzZS5QcmljZXMpLCAuZ3JvdXBzID0gImtlZXAiKSkKZ3JvdXBlZF95ZWFyCmBgYAoKYGBge3J9CkRlbnNpdHkuY2Vuc3VzIDwtIERlbnNpdHkuY2Vuc3VzICU+JQogIGlubmVyX2pvaW4oZ3JvdXBlZF95ZWFyICU+JSBzZWxlY3QoLUNvZGUsIC1SZWdpb24pLCBieSA9IGpvaW5fYnkoWWVhciA9PSBZZWFyLCBTdGF0ZSA9PSBTdGF0ZSkpCkRlbnNpdHkuY2Vuc3VzCmBgYAoKYGBge3J9ClAuMTk3NSA8LSBEZW5zaXR5LmNlbnN1cyAlPiUKICBmaWx0ZXIoWWVhciA9PSAxOTc1KSAlPiUKICBzZWxlY3QoU3RhdGUsIEF2ZXJhZ2UuSG91c2UuUHJpY2VzKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJocDE5NzUiID0gIkF2ZXJhZ2UuSG91c2UuUHJpY2VzIikKRGVuc2l0eS5jZW5zdXMgPC0gRGVuc2l0eS5jZW5zdXMgJT4lCiAgbGVmdF9qb2luKFAuMTk3NSwgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkKRGVuc2l0eS5jZW5zdXMKYGBgCgpgYGB7cn0KRGVuc2l0eS5jZW5zdXMkUHJpY2VfRGlmZiA9IERlbnNpdHkuY2Vuc3VzJEF2ZXJhZ2UuSG91c2UuUHJpY2VzIC0gRGVuc2l0eS5jZW5zdXMkaHAxOTc1CkRlbnNpdHkuY2Vuc3VzJFByaWNlX1JhdGlvID0gRGVuc2l0eS5jZW5zdXMkQXZlcmFnZS5Ib3VzZS5QcmljZXMgLyBEZW5zaXR5LmNlbnN1cyRocDE5NzUKRGVuc2l0eS5jZW5zdXMgPC0gRGVuc2l0eS5jZW5zdXMgJT4lIHNlbGVjdCgtaHAxOTc1KQpEZW5zaXR5LmNlbnN1cwpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTR9CmdncGxvdChkYXRhID0gZ3JvdXBlZF95ZWFyICU+JSBmaWx0ZXIoU3RhdGUgIT0gJ0Rpc3RyaWN0IG9mIENvbHVtYmlhJykpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBzZSA9IEZBTFNFLCBjb2xvciA9ICdkYXJrZ3JleScsIGxpbmV3aWR0aCA9IDAuNCwgYWVzKHggPSBZZWFyLCB5ID0gQXZlcmFnZS5Ib3VzZS5QcmljZXMpKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoeCA9IFllYXIsIHkgPSBBdmVyYWdlLkhvdXNlLlByaWNlcywgY29sb3IgPSBSZWdpb24pKSArCiAgZmFjZXRfd3JhcCh+U3RhdGUsIG5jb2wgPSAxMCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiSG91c2UgUHJpY2VzICgxOTc1IC0gMjAxOSkgZm9yIEFsbCBTdGF0ZXMiKSArCiAgeGxhYigiVGltZSBQZXJpb2QgKFllYXJzKSIpICsgeWxhYigiQWRqdXN0ZWQgQXZlcmFnZSBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJUcmVuZHMgaW4gaG91c2UgcHJpY2VzIChhZGp1c3RlZCBmb3IgaW5mbGF0aW9uKSBmYWNldGVkIGJ5IHN0YXRlIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuMSwgImxpbmVzIikpCmBgYAoKYGBge3J9CnRlbXAgPC0gZ3JvdXBlZF95ZWFyICU+JQogIGZpbHRlcihZZWFyID09IDE5NzUpICU+JQogIHNlbGVjdChTdGF0ZSwgQXZlcmFnZS5Ib3VzZS5QcmljZXMpICU+JQogIGRwbHlyOjpyZW5hbWUoJzE5NzUuUHJpY2VzJyA9ICdBdmVyYWdlLkhvdXNlLlByaWNlcycpCmd5IDwtIGxlZnRfam9pbihncm91cGVkX3llYXIsIHRlbXAsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpCmd5CmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBneSAlPiUgZmlsdGVyKFN0YXRlICE9ICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpLCBhZXMoeCA9IFllYXIsIHkgPSBBdmVyYWdlLkhvdXNlLlByaWNlcyAtIGAxOTc1LlByaWNlc2ApKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgc2UgPSBGQUxTRSwgY29sb3IgPSAnZGFya2dyZXknLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycpICsKICBmYWNldF93cmFwKH5SZWdpb24sIG5jb2wgPSAxKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkhvdXNlIFByaWNlcyAoMTk3NSAtIDIwMTkpIGZvciBBbGwgU3RhdGVzIikgKwogIHhsYWIoIlRpbWUgUGVyaW9kIChZZWFycykiKSArIHlsYWIoIkRpZmZlcmVuY2UgaW4gSG91c2UgUHJpY2VzIikgKwogIGxhYnMoc3VidGl0bGUgPSAiRGlmZmVyZW5jZXMgaW4gaG91c2UgcHJpY2VzIChhZGp1c3RlZCBmb3IgaW5mbGF0aW9uKSBmcm9tIDE5NzUgZm9yIGFsbCBzdGF0ZXMgZmFjZXRlZCBieSByZWdpb24iKSArCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5zcGFjaW5nID0gdW5pdCgwLjEsICJsaW5lcyIpKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEzfQpnZ3Bsb3QoZGF0YSA9IGdyb3VwZWRfeWVhciAlPiUgZmlsdGVyKFN0YXRlICE9ICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpLCBhZXMoeCA9IFllYXIsIHkgPSBBdmVyYWdlLkhvdXNlLlByaWNlcykpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBzZSA9IEZBTFNFLCBjb2xvciA9ICdkYXJrZ3JleScsIGxpbmV0eXBlID0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX2xpbmUoc3RhdCA9ICdpZGVudGl0eScsIGFlcyhjb2xvciA9IFN0YXRlKSkgKwogIGZhY2V0X3dyYXAoflJlZ2lvbiwgbmNvbCA9IDEpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiSG91c2UgUHJpY2VzICgxOTc1IC0gMjAxOSkgZm9yIEFsbCBTdGF0ZXMiKSArCiAgeGxhYigiVGltZSBQZXJpb2QgKFllYXJzKSIpICsgeWxhYigiQWRqdXN0ZWQgQXZlcmFnZSBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJUcmVuZHMgaW4gaG91c2UgcHJpY2VzIChhZGp1c3RlZCBmb3IgaW5mbGF0aW9uKSBmb3IgYWxsIHN0YXRlcyBmYWNldGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuMSwgImxpbmVzIikpCmBgYAoKYGBge3J9Cmdyb3VwZWRfcmVnaW9uIDwtCiAgZGF0YS5mcmFtZShjb21wYXJlXzIwMTlfMTk3NSAlPiUgZmlsdGVyKFN0YXRlICE9ICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpICU+JQogIGRwbHlyOjpncm91cF9ieShZZWFyLCBSZWdpb24pICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoQXZlcmFnZS5Ib3VzZS5QcmljZXMgPSBtZWFuKEFkanVzdGVkLkhvdXNlLlByaWNlcyksIC5ncm91cHMgPSAia2VlcCIpKQpncm91cGVkX3JlZ2lvbgpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD02fQpnZ3Bsb3QoZGF0YSA9IGdyb3VwZWRfcmVnaW9uLCBhZXMoeCA9IFllYXIsIHkgPSBBdmVyYWdlLkhvdXNlLlByaWNlcywgY29sb3I9UmVnaW9uKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGZvcm11bGEgPSB5fngsIHNlID0gRkFMU0UsIGNvbG9yID0gJ2RhcmtncmV5JywgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMSkgKwogIGdlb21fbGluZShzdGF0ID0gImlkZW50aXR5IiwgYWxwaGE9MC42KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJIb3VzZSBQcmljZXMgKDE5NzUgLSAyMDE5KSBmb3IgQWxsIFJlZ2lvbnMiKSArCiAgeGxhYigiVGltZSBQZXJpb2QgKFllYXJzKSIpICsgeWxhYigiQWRqdXN0ZWQgQXZlcmFnZSBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJUcmVuZHMgaW4gYXZlcmFnZSBob3VzZSBwcmljZXMgKGFkanVzdGVkIGZvciBpbmZsYXRpb24pIGdyb3VwZWQgYnkgcmVnaW9uIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAwLjUsIHNpemUgPSA2KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMC4wLCAibGluZXMiKSkKYGBgCgpgYGB7cn0KZ3JvdXBlZF9yZWdpb25fdCA8LQogIGRhdGEuZnJhbWUoZ3kgJT4lIGZpbHRlcihTdGF0ZSAhPSAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoWWVhciwgUmVnaW9uKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKEF2ZXJhZ2UuSG91c2UuUHJpY2VzID0gbWVhbihBdmVyYWdlLkhvdXNlLlByaWNlcyksIFByaWNlcy4xOTc1ID0gbWVhbihgMTk3NS5QcmljZXNgKSwgLmdyb3VwcyA9ICJrZWVwIikpCmdyb3VwZWRfcmVnaW9uX3QKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9Nn0KZ2dwbG90KGRhdGEgPSBncm91cGVkX3JlZ2lvbl90LCBhZXMoeCA9IFllYXIsIHkgPSBBdmVyYWdlLkhvdXNlLlByaWNlcyAtIFByaWNlcy4xOTc1LCBjb2xvcj1SZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgc2UgPSBGQUxTRSwgY29sb3IgPSAnZGFya2dyZXknLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYT0wLjYpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkhvdXNlIFByaWNlcyAoMTk3NSAtIDIwMTkpIGZvciBBbGwgUmVnaW9ucyIpICsKICB4bGFiKCJUaW1lIFBlcmlvZCAoWWVhcnMpIikgKyB5bGFiKCJEaWZmZXJlbmNlIGluIEhvdXNlIFByaWNlcyIpICsKICBsYWJzKHN1YnRpdGxlID0gIkRJZmVyZW5jZSBpbiBhdmVyYWdlIGhvdXNlIHByaWNlcyBmcm9tIDE5NzUgdG8gMjAxOSBncm91cGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMC41LCBzaXplID0gNiksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuMCwgImxpbmVzIikpCmBgYAoKYGBge3J9Cmdyb3VwZWRfcmVnaW9uX3dpZGUgPC0gCiAgZ3JvdXBlZF9yZWdpb24gJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFllYXIsIHZhbHVlc19mcm9tID0gQXZlcmFnZS5Ib3VzZS5QcmljZXMpCmdyb3VwZWRfcmVnaW9uX3dpZGUkUHJpY2UuRGlmZmVyZW5jZSA9IGdyb3VwZWRfcmVnaW9uX3dpZGUkJzIwMTknIC0gZ3JvdXBlZF9yZWdpb25fd2lkZSQnMTk3NScKZ3JvdXBlZF9yZWdpb25fd2lkZSA8LSAKICBncm91cGVkX3JlZ2lvbl93aWRlICU+JQogIGFycmFuZ2UoUHJpY2UuRGlmZmVyZW5jZSkKZ3JvdXBlZF9yZWdpb25fd2lkZQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGdyb3VwZWRfcmVnaW9uX3dpZGUgJT4lIGZpbHRlcihSZWdpb24gIT0gIlVTIEFkanVzdGVkIEF2Zy4iKSwgYWVzKHggPSBSZWdpb24sIHkgPSBQcmljZS5EaWZmZXJlbmNlLCBmaWxsPVJlZ2lvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgYWxwaGE9MC42KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJIb3VzZSBQcmljZXMgKDE5NzUgLSAyMDE5KSBmb3IgQWxsIFJlZ2lvbnMiKSArCiAgeGxhYigiUmVnaW9uIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiRGlmZmVyZW5jZSBpbiBhdmVyYWdlIGhvdXNlIHByaWNlcyBmb3IgZWFjaCByZWdpb24gZnJvbSAxOTc1IHRvIDIwMTkiKQpgYGAKCmBgYHtyfQpncm91cGVkX3llYXJfd2lkZSA8LSAKICBncm91cGVkX3llYXIgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFllYXIsIHZhbHVlc19mcm9tID0gQXZlcmFnZS5Ib3VzZS5QcmljZXMpCmdyb3VwZWRfeWVhcl93aWRlJFByaWNlLkRpZmZlcmVuY2UgPSBncm91cGVkX3llYXJfd2lkZSQnMjAxOScgLSBncm91cGVkX3llYXJfd2lkZSQnMTk3NScKZ3JvdXBlZF95ZWFyX3dpZGUgPC0gCiAgZ3JvdXBlZF95ZWFyX3dpZGUgJT4lCiAgYXJyYW5nZShQcmljZS5EaWZmZXJlbmNlKSAlPiUKICBmaWx0ZXIoU3RhdGUgIT0gJ0Rpc3RyaWN0IG9mIENvbHVtYmlhJykKZ3JvdXBlZF95ZWFyX3dpZGUKYGBgCgpgYGB7cn0KbW9zdF9wcmljZV9pbmNyZWFzZSA8LSB0YWlsKGdyb3VwZWRfeWVhcl93aWRlLCAxMCkKbW9zdF9wcmljZV9kcm9wIDwtIGhlYWQoZ3JvdXBlZF95ZWFyX3dpZGUsIDEwKQptb3N0X3ByaWNlX2luY3JlYXNlJHZhciA9ICJQcmljZSBJbmNyZWFzZSIKbW9zdF9wcmljZV9kcm9wJHZhciA9ICJQcmljZSBEZWNyZWFzZSIKcHJpY2VfY2hhbmdlID0gcmJpbmQoaGVhZChtb3N0X3ByaWNlX2Ryb3AsIDUpLCB0YWlsKG1vc3RfcHJpY2VfaW5jcmVhc2UsIDUpKQpwcmljZV9jaGFuZ2UKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTJ9CmJwMSA8LSBnZ3Bsb3QoZGF0YSA9IGhlYWQobW9zdF9wcmljZV9kcm9wLCA1KSwgYWVzKHggPSBTdGF0ZSwgeSA9IFByaWNlLkRpZmZlcmVuY2UpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZGFya2JsdWUiLCBhbHBoYSA9IDAuNykgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gcm91bmQoUHJpY2UuRGlmZmVyZW5jZSwgMikpLCBudWRnZV94ID0gLTAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkxlYXN0IFByaWNlIENoYW5nZSIpICsKICB4bGFiKCJTdGF0ZSIpICsgeWxhYigiUHJpY2UgRGlmZmVyZW5jZSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlN0YXRlcyB3aXRoIHRoZSBsb3dlc3QgKG1vc3QgbmVnYXRpdmUpIHByaWNlIGNoYW5nZSBiZXR3ZWVuIDE5NzUgYW5kIDIwMTkiKQpicDIgPC0gZ2dwbG90KGRhdGEgPSB0YWlsKG1vc3RfcHJpY2VfaW5jcmVhc2UsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gUHJpY2UuRGlmZmVyZW5jZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuNykgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gcm91bmQoUHJpY2UuRGlmZmVyZW5jZSwgMikpLCBudWRnZV94ID0gMC4xLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiTW9zdCBQcmljZSBDaGFuZ2UiKSArCiAgeGxhYigiU3RhdGUiKSArIHlsYWIoIlByaWNlIERpZmZlcmVuY2UiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgaGlnaGVzdCAobW9zdCBwb3NpdGl2ZSkgcHJpY2UgY2hhbmdlIGJldHdlZW4gMTk3NSBhbmQgMjAxOSIpCmdyaWQuYXJyYW5nZShicDEsIGJwMiwgbmNvbCA9IDIpCmBgYAoKIyMgUXVlc3Rpb24gLSAyCgpgYGB7cn0KQ29tYmluZWQuMjAxOSA8LSBDZW5zdXMuMjAxOSAlPiUgCiAgaW5uZXJfam9pbihEZW5zaXR5LjIwMTksIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpICU+JSAKICBpbm5lcl9qb2luKGdyb3VwZWRfeWVhciAlPiUgZmlsdGVyKFllYXIgPT0gMjAxOSkgJT4lIHNlbGVjdChTdGF0ZSwgQXZlcmFnZS5Ib3VzZS5QcmljZXMpLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKQpDb21iaW5lZC4yMDE5JFllYXIgPSAyMDE5CkNvbWJpbmVkLjIwMTkgPC0gQ29tYmluZWQuMjAxOSAlPiUKICBmaWx0ZXIoU3RhdGUgIT0gJ0Rpc3RyaWN0IG9mIENvbHVtYmlhJykKQ29tYmluZWQuMjAxOQpgYGAKCmBgYHtyfQpDb21iaW5lZCA8LQogIENvbWJpbmVkLjIwMTkgJT4lCiAgZHBseXI6OnJlbmFtZSgiUG9wdWxhdGlvbi4yMDE5IiA9ICJQb3B1bGF0aW9uIiwgIkRlbnNpdHkuMjAxOSIgPSAiRGVuc2l0eSIsICJQcmljZXMuMjAxOSIgPSAiQXZlcmFnZS5Ib3VzZS5QcmljZXMiKSAlPiUKICBpbm5lcl9qb2luKENvbWJpbmVkLjE5NzUsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpICU+JQogIGlubmVyX2pvaW4oZ3JvdXBlZF95ZWFyICU+JSBmaWx0ZXIoWWVhciA9PSAxOTc1KSAlPiUgc2VsZWN0KFN0YXRlLCBBdmVyYWdlLkhvdXNlLlByaWNlcyksIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpICU+JQogIGRwbHlyOjpyZW5hbWUoIlBvcHVsYXRpb24uMTk3NSIgPSAiUG9wdWxhdGlvbiIsICJEZW5zaXR5LjE5NzUiID0gIkRlbnNpdHkiLCAiUHJpY2VzLjE5NzUiID0gIkF2ZXJhZ2UuSG91c2UuUHJpY2VzIikgJT4lCiAgc2VsZWN0KC1ZZWFyLngsIC1ZZWFyLnkpICU+JQogIGlubmVyX2pvaW4oU3RhdGUuUmVnaW9uLkRldGFpbHMsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpCkNvbWJpbmVkJFByaWNlLkRpZmYgPSBDb21iaW5lZCRQcmljZXMuMjAxOSAtIENvbWJpbmVkJFByaWNlcy4xOTc1CkNvbWJpbmVkJERlbnNpdHkuRGlmZiA9IENvbWJpbmVkJERlbnNpdHkuMjAxOSAtIENvbWJpbmVkJERlbnNpdHkuMTk3NQpDb21iaW5lZCRQb3B1bGF0aW9uLkRpZmYgPSBDb21iaW5lZCRQb3B1bGF0aW9uLjIwMTkgLSBDb21iaW5lZCRQb3B1bGF0aW9uLjE5NzUKQ29tYmluZWQKYGBgCgpgYGB7cn0KYSA8LSBncm91cGVkX3llYXIgJT4lCiAgZmlsdGVyKFllYXIgPT0gMTk3NSkgJT4lCiAgc2VsZWN0KFllYXIsIFN0YXRlLCBBdmVyYWdlLkhvdXNlLlByaWNlcykgJT4lCiAgaW5uZXJfam9pbihDb21iaW5lZC4xOTc1ICU+JSBzZWxlY3QoLVllYXIpLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKQpiIDwtCiAgQ29tYmluZWQuMjAxOSAlPiUKICBzZWxlY3QoWWVhciwgU3RhdGUsIEF2ZXJhZ2UuSG91c2UuUHJpY2VzLCBQb3B1bGF0aW9uLCBEZW5zaXR5KQpDb21iaW5lZF9sb25nIDwtIHJiaW5kKGEsIGIpICU+JSAKICBmaWx0ZXIoU3RhdGUgIT0gIkRpc3RyaWN0IG9mIENvbHVtYmlhIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIlByaWNlIiA9ICJBdmVyYWdlLkhvdXNlLlByaWNlcyIpICU+JSAKICBtdXRhdGVfYXQoIlllYXIiLCBhcy5jaGFyYWN0ZXIpICU+JQogIGlubmVyX2pvaW4oU3RhdGUuUmVnaW9uLkRldGFpbHMsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpCkNvbWJpbmVkX2xvbmcKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChkYXRhID0gQ29tYmluZWQsIGFlcyh4ID0gRGVuc2l0eS5EaWZmLCB5ID0gUHJpY2UuRGlmZiwgc2l6ZSA9IFBvcHVsYXRpb24uRGlmZiwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBjb2xvciA9ICdkYXJrZ3JleScsIGFscGhhID0gMC40LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBsaW5ld2lkdGggPSAxLCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gQ29kZSksIG51ZGdlX3ggPSAwLjEsIG51ZGdlX3kgPSAwLjEsIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSAyMCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiVHJlbmQgQmV0d2VlbiBEZW5zaXR5IGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiRGlmZmVyZW5jZSBpbiBEZW5zaXR5IikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU2NhdHRlcnBsb3QgZXhwbGFpbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGRpZmZlcmVuY2UgaW4gZGVuc2l0aWVzIGFuZCB0aGUgY2hhbmdlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDE5NzUgYW5kIDIwMTkiKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMiwgd2FybmluZz1GQUxTRX0KZ2dwbG90KGRhdGEgPSBDb21iaW5lZCwgYWVzKHggPSBEZW5zaXR5LkRpZmYsIHkgPSBQcmljZS5EaWZmLCBzaXplID0gUG9wdWxhdGlvbi5EaWZmLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGZvcm11bGEgPSB5fngsIGNvbG9yID0gJ2RhcmtncmV5JywgYWxwaGEgPSAwLjQsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGxpbmV3aWR0aCA9IDEsIHNlID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBDb2RlKSwgbnVkZ2VfeCA9IDAuMSwgbnVkZ2VfeSA9IDAuMSwgc2l6ZSA9IDIsIG1heC5vdmVybGFwcyA9IDIwKSArCiAgZmFjZXRfd3JhcCh+UmVnaW9uLCBucm93ID0gMikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiVHJlbmQgQmV0d2VlbiBEZW5zaXR5IGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiRGlmZmVyZW5jZSBpbiBEZW5zaXR5IikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU2NhdHRlcnBsb3QgZXhwbGFpbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGRpZmZlcmVuY2UgaW4gZGVuc2l0aWVzIGFuZCB0aGUgY2hhbmdlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDE5NzUgYW5kIDIwMTkgZm9yIGVhY2ggcmVnaW9uIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChkYXRhID0gQ29tYmluZWQsIGFlcyh4ID0gbG9nKChEZW5zaXR5LjIwMTkvRGVuc2l0eS4xOTc1KSksIHkgPSBsb2coKFByaWNlcy4yMDE5L1ByaWNlcy4xOTc1KSksIHNpemUgPSAoUG9wdWxhdGlvbi4yMDE5L1BvcHVsYXRpb24uMTk3NSksIGNvbG9yID0gU3RhdGUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGZvcm11bGEgPSB5fngsIGNvbG9yID0gJ2RhcmtncmV5JywgYWxwaGEgPSAwLjQsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGxpbmV3aWR0aCA9IDEsIHNlID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBDb2RlKSwgbnVkZ2VfeCA9IDAuMDEsIG51ZGdlX3kgPSAwLjAxLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIlRyZW5kIEJldHdlZW4gRGVuc2l0eSBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIlByb3BvcnRpb24gb2YgRGVuc2l0eSAobG9nIHNjYWxlKSIpICsgeWxhYigiUHJvcG9ydGlvbiBvZiBQcmljZSAobG9nIHNjYWxlKSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcm9wb3J0aW9uYWwgY2hhbmdlIGluIGRlbnNpdGllcyBhbmQgdGhlIHByb3BvcnRpb25hbCBjaGFuZ2UgaW4gaG91c2UgcHJpY2VzIGJldHdlZW4gMTk3NSBhbmQgMjAxOSIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEyLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IENvbWJpbmVkLCBhZXMoeCA9IGxvZygoRGVuc2l0eS4yMDE5L0RlbnNpdHkuMTk3NSkpLCB5ID0gbG9nKChQcmljZXMuMjAxOS9QcmljZXMuMTk3NSkpLCBzaXplID0gKFBvcHVsYXRpb24uMjAxOS9Qb3B1bGF0aW9uLjE5NzUpLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBjb2xvciA9ICdkYXJrZ3JleScsIGFscGhhID0gMC40LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBsaW5ld2lkdGggPSAxLCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gQ29kZSksIG51ZGdlX3ggPSAwLjEsIG51ZGdlX3kgPSAwLjEsIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSAyMCkgKwogIGZhY2V0X3dyYXAoflJlZ2lvbiwgbnJvdyA9IDIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIlRyZW5kIEJldHdlZW4gRGVuc2l0eSBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIlByb3BvcnRpb24gb2YgRGVuc2l0eSAobG9nIHNjYWxlKSIpICsgeWxhYigiUHJvcG9ydGlvbiBvZiBQcmljZSAobG9nIHNjYWxlKSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcm9wb3J0aW9uYWwgY2hhbmdlIGluIGRlbnNpdGllcyBhbmQgdGhlIHByb3BvcnRpb25hbCBjaGFuZ2UgaW4gaG91c2UgcHJpY2VzIGJldHdlZW4gMTk3NSBhbmQgMjAxOSBmYWNldGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMSwgImxpbmVzIikpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEyfQpnZ3Bsb3QoZGF0YSA9IERlbnNpdHkuY2Vuc3VzICU+JSBmaWx0ZXIoWWVhciAhPSAxOTc1KSwgYWVzKHggPSBsb2coRGVuc2l0eV9SYXRpbyksIHkgPSBsb2coUHJpY2VfUmF0aW8pLCBjb2xvciA9IENvZGUsICkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC40KSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdibGFjaycsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDAuNikgKwogICNnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUsIGNvbG9yID0gQ29kZSksIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSA1MCkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgZmFjZXRfZ3JpZChSZWdpb25+WWVhcikgKyAKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJUcmVuZCBCZXR3ZWVuIERlbnNpdHkgYW5kIEhvdXNlIFByaWNlcyIpICsKICB4bGFiKCJQcm9wb3J0aW9uIG9mIERlbnNpdHkgKGxvZyBzY2FsZSkiKSArIHlsYWIoIlByb3BvcnRpb24gb2YgUHJpY2UgKGxvZyBzY2FsZSkiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJQcm9wb3J0aW9uYWwgY2hhbmdlIGluIGRlbnNpdGllcyBhbmQgdGhlIHByb3BvcnRpb25hbCBjaGFuZ2UgaW4gaG91c2UgcHJpY2VzIGJldHdlZW4gMTk3NSBhbmQgMjAxOSBmYWNldGVkIGJ5IHJlZ2lvbiBhbmQgeWVhciIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0xNH0KZ2dwbG90KGRhdGEgPSBEZW5zaXR5LmNlbnN1cywgYWVzKHggPSBEZW5zaXR5LCB5ID0gQXZlcmFnZS5Ib3VzZS5QcmljZXMsIGNvbG9yID0gUmVnaW9uKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQpICsgCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGNvbG9yID0gJ2RhcmtncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgI2dlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbG9yID0gJ2RhcmtncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnYmxhY2snLCBzZSA9IEZBTFNFLCBsaW5ld2lkdGggPSAwLjYpICsKICAjZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBDb2RlLCBjb2xvciA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gNTApICsKICAjc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBmYWNldF9ncmlkKH5ZZWFyKSArIAogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIlRyZW5kIEJldHdlZW4gRGVuc2l0eSBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIlBvcHVsYXRpb24gRGVuc2l0eSIpICsgeWxhYigiQXZlcmFnZSBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJQcm9wb3J0aW9uYWwgY2hhbmdlIGluIGRlbnNpdGllcyBhbmQgdGhlIHByb3BvcnRpb25hbCBjaGFuZ2UgaW4gaG91c2UgcHJpY2VzIGFjcm9zcyBkZWNhZGVzIGJldHdlZW4gMTk3NSBhbmQgMjAxOSBmYWNldGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBEZW5zaXR5LmNlbnN1cywgYWVzKHggPSBZZWFyLCB5ID0gbG9nKFByaWNlX1JhdGlvKSwgY29sb3IgPSBsb2coRGVuc2l0eV9SYXRpbykpKSArCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpICsKICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIobmFtZSA9ICdQcm9wb3J0aW9uIG9mIERlbnNpdHknLCBwYWxldHRlID0gIllsT3JSZCIpICsKICBmYWNldF93cmFwKH5TdGF0ZSwgbnJvdyA9IDUpICsgCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiVHJlbmQgQmV0d2VlbiBEZW5zaXR5IGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiWWVhcnMiKSArIHlsYWIoIlByb3BvcnRpb24gb2YgUHJpY2UgKGxvZyBzY2FsZSkiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTY2F0dGVycGxvdCBleHBsYWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcHJvcG9ydGlvbmFsIGNoYW5nZSBpbiBkZW5zaXRpZXMgYW5kIHRoZSBwcm9wb3J0aW9uYWwgY2hhbmdlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDE5NzUgYW5kIDIwMTkgZmFjZXRlZCBieSByZWdpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLCBhbmdsZSA9IDQ1KSkKYGBgCgojIyBRdWVzdGlvbiAtIDMKCiMjIyBZZWFyIFJhbmdlIC0gMTk5MCB0byAyMDAwCgpgYGB7cn0KYTEgPC0gCiAgcmJpbmQoCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMTk5MCkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4xOTkwLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSksCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMjAwMCkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4yMDAwLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSkpICU+JQogICAgc2VsZWN0KC1BdmVyYWdlLkhvdXNlLlByaWNlcykgJT4lCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gWWVhciwgdmFsdWVzX2Zyb20gPSBQb3B1bGF0aW9uKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoIlBvcHVsYXRpb24uMTk5MCIgPSAiMTk5MCIsICJQb3B1bGF0aW9uLjIwMDAiID0gIjIwMDAiKQpiMSA8LQogIHJiaW5kKAogICAgKGdyb3VwZWRfeWVhciAlPiUKICAgIGZpbHRlcihZZWFyID09IDE5OTApICU+JQogICAgaW5uZXJfam9pbihDZW5zdXMuMTk5MCwgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkpLAogICAgKGdyb3VwZWRfeWVhciAlPiUKICAgIGZpbHRlcihZZWFyID09IDIwMDApICU+JQogICAgaW5uZXJfam9pbihDZW5zdXMuMjAwMCwgYnkgPSBqb2luX2J5KFN0YXRlID09IFN0YXRlKSkpKSAlPiUKICAgIHNlbGVjdCgtUG9wdWxhdGlvbikgJT4lCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gWWVhciwgdmFsdWVzX2Zyb20gPSBBdmVyYWdlLkhvdXNlLlByaWNlcykgJT4lCiAgICBkcGx5cjo6cmVuYW1lKCJBdmVyYWdlLkhvdXNlLlByaWNlLjE5OTAiID0gIjE5OTAiLCAiQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDAwIiA9ICIyMDAwIikKVmFsdWVzLjE5OTAuMjAwMCA8LQogIGExICU+JSAKICBpbm5lcl9qb2luKGIxLCBieSA9IGpvaW5fYnkoU3RhdGUpKSAlPiUgCiAgc2VsZWN0KC1Db2RlLnksIC1SZWdpb24ueSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoIkNvZGUiID0gIkNvZGUueCIsICJSZWdpb24iID0gIlJlZ2lvbi54IikgJT4lCiAgZmlsdGVyKFN0YXRlICE9ICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpClZhbHVlcy4xOTkwLjIwMDAKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTJ9ClZhbHVlcy4xOTkwLjIwMDAgPC0gCiAgVmFsdWVzLjE5OTAuMjAwMCAlPiUKICBhcnJhbmdlKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCkKCmJwMyA8LSBnZ3Bsb3QoZGF0YSA9IGhlYWQoVmFsdWVzLjE5OTAuMjAwMCwgNSksIGFlcyh4ID0gU3RhdGUsIHkgPSAoKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCkvQXZlcmFnZS5Ib3VzZS5QcmljZS4xOTkwKSoxMDApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZGFya2JsdWUiLCBhbHBoYSA9IDAuNykgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gcm91bmQoKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDAgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjE5OTApL0F2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCkqMTAwLCAyKSksIG51ZGdlX3ggPSAtMC4xLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiTGVhc3QgUHJpY2UgQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlICUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgbG93ZXN0IHBlcmNlbnRhZ2UgcHJpY2UgY2hhbmdlIGJldHdlZW4gMTk5MCBhbmQgMjAwMCIpCmJwNCA8LSBnZ3Bsb3QoZGF0YSA9IHRhaWwoVmFsdWVzLjE5OTAuMjAwMCwgNSksIGFlcyh4ID0gU3RhdGUsIHkgPSAoKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCkvQXZlcmFnZS5Ib3VzZS5QcmljZS4xOTkwKSoxMDApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjcpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IHJvdW5kKCgoQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDAwIC0gQXZlcmFnZS5Ib3VzZS5QcmljZS4xOTkwKS9BdmVyYWdlLkhvdXNlLlByaWNlLjE5OTApKjEwMCwgMikpLCBudWRnZV94ID0gMC4xLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiTW9zdCBQcmljZSBDaGFuZ2UiKSArCiAgeGxhYigiU3RhdGUiKSArIHlsYWIoIlByaWNlIERpZmZlcmVuY2UgJSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlN0YXRlcyB3aXRoIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2UgcHJpY2UgY2hhbmdlIGJldHdlZW4gMTk5MCBhbmQgMjAwMCIpCmdyaWQuYXJyYW5nZShicDMsIGJwNCwgbmNvbCA9IDIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEyfQpWYWx1ZXMuMTk5MC4yMDAwIDwtIAogIFZhbHVlcy4xOTkwLjIwMDAgJT4lCiAgYXJyYW5nZShQb3B1bGF0aW9uLjIwMDAgLSBQb3B1bGF0aW9uLjE5OTApCgpicDUgPC0gZ2dwbG90KGRhdGEgPSBoZWFkKFZhbHVlcy4xOTkwLjIwMDAsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChQb3B1bGF0aW9uLjIwMDAgLSBQb3B1bGF0aW9uLjE5OTApL1BvcHVsYXRpb24uMTk5MCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtibHVlIiwgYWxwaGEgPSAwLjcpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IHJvdW5kKCgoUG9wdWxhdGlvbi4yMDAwIC0gUG9wdWxhdGlvbi4xOTkwKS9Qb3B1bGF0aW9uLjE5OTApKjEwMCwgMikpLCBudWRnZV94ID0gLTAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkxlYXN0IFBvcHVsYXRpb24gQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQb3B1bGF0aW9uIERpZmZlcmVuY2UgJSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlN0YXRlcyB3aXRoIHRoZSBsb3dlc3QgcGVyY2VudGFnZSBwb3B1bGF0aW9uIGNoYW5nZSBiZXR3ZWVuIDE5OTAgYW5kIDIwMDAiKQpicDYgPC0gZ2dwbG90KGRhdGEgPSB0YWlsKFZhbHVlcy4xOTkwLjIwMDAsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChQb3B1bGF0aW9uLjIwMDAgLSBQb3B1bGF0aW9uLjE5OTApL1BvcHVsYXRpb24uMTk5MCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtncmVlbiIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKFBvcHVsYXRpb24uMjAwMCAtIFBvcHVsYXRpb24uMTk5MCkvUG9wdWxhdGlvbi4xOTkwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IDAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIk1vc3QgUG9wdWxhdGlvbiBDaGFuZ2UiKSArCiAgeGxhYigiU3RhdGUiKSArIHlsYWIoIlBvcHVsYXRpb24gRGlmZmVyZW5jZSAlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU3RhdGVzIHdpdGggdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBwb3B1bGF0aW9uIGNoYW5nZSBiZXR3ZWVuIDE5OTAgYW5kIDIwMDAiKQpncmlkLmFycmFuZ2UoYnA1LCBicDYsIG5jb2wgPSAyKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBWYWx1ZXMuMTk5MC4yMDAwLCBhZXMoeCA9IChQb3B1bGF0aW9uLjIwMDAgLSBQb3B1bGF0aW9uLjE5OTApLCB5ID0gKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCksIGNvbG9yID0gU3RhdGUpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIigxOTkwIGFuZCAyMDAwKSBUcmVuZCBCZXR3ZWVuIFBvcHVsYXRpb24gYW5kIEhvdXNlIFByaWNlcyIpICsKICB4bGFiKCJEaWZmZXJlbmNlIGluIFByaWNlIikgKyB5bGFiKCJEaWZmZXJlbmNlIGluIEhvdXNlIFByaWNlcyIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHBvcHVsYXRpb24gYW5kIHRoZSBkaWZmZXJlbmNlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDE5OTAgYW5kIDIwMDAiKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBWYWx1ZXMuMTk5MC4yMDAwLCBhZXMoeCA9IChQb3B1bGF0aW9uLjIwMDAgLSBQb3B1bGF0aW9uLjE5OTApLCB5ID0gKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMTk5MCksIGNvbG9yID0gU3RhdGUpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICBmYWNldF93cmFwKH5SZWdpb24sIG5yb3cgPSAyKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCIoMTk5MCBhbmQgMjAwMCkgVHJlbmQgQmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiRGlmZmVyZW5jZSBpbiBQcmljZSIpICsgeWxhYigiRGlmZmVyZW5jZSBpbiBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTY2F0dGVycGxvdCBleHBsYWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGlmZmVyZW5jZSBpbiBwb3B1bGF0aW9uIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiBob3VzZSBwcmljZXMgYmV0d2VlbiAxOTkwIGFuZCAyMDAwIGZhY2V0ZWQgYnkgcmVnaW9uIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjE5OTAuMjAwMCwgYWVzKHggPSBsb2coKFBvcHVsYXRpb24uMjAwMCAvIFBvcHVsYXRpb24uMTk5MCkpLCB5ID0gbG9nKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDAgLyBBdmVyYWdlLkhvdXNlLlByaWNlLjE5OTApKSwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIigxOTkwIGFuZCAyMDAwKSBUcmVuZCBCZXR3ZWVuIFBvcHVsYXRpb24gYW5kIEhvdXNlIFByaWNlcyIpICsKICB4bGFiKCJQcm9wb3J0aW9uIG9mIFBvcHVsYXRpb24gKGxvZyBzY2FsZSkiKSArIHlsYWIoIlByb3BvcnRpb24gb2YgSG91c2UgUHJpY2VzIChsb2cgc2NhbGUpIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU2NhdHRlcnBsb3QgZXhwbGFpbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJhdGlvIG9mIHBvcHVsYXRpb24gYW5kIHRoZSByYXRpbyBvZiBob3VzZSBwcmljZXMgYmV0d2VlbiAxOTkwIGFuZCAyMDAwIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjE5OTAuMjAwMCwgYWVzKHggPSBsb2coKFBvcHVsYXRpb24uMjAwMCAvIFBvcHVsYXRpb24uMTk5MCkpLCB5ID0gbG9nKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDAgLyBBdmVyYWdlLkhvdXNlLlByaWNlLjE5OTApKSwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gNTApICsKICBmYWNldF93cmFwKH5SZWdpb24sIG5yb3cgPSAyKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCIoMTk5MCBhbmQgMjAwMCkgVHJlbmQgQmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiUHJvcG9ydGlvbiBvZiBQb3B1bGF0aW9uIChsb2cgc2NhbGUpIikgKyB5bGFiKCJQcm9wb3J0aW9uIG9mIEhvdXNlIFByaWNlcyAobG9nIHNjYWxlKSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByYXRpbyBvZiBwb3B1bGF0aW9uIGFuZCB0aGUgcmF0aW8gb2YgaG91c2UgcHJpY2VzIGJldHdlZW4gMTk5MCBhbmQgMjAwMCBmYWNldGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMSwgImxpbmVzIikpCmBgYAoKIyMjIFllYXIgUmFuZ2UgLSAyMDAwIHRvIDIwMTAKCmBgYHtyfQphMiA8LSAKICByYmluZCgKICAgIChncm91cGVkX3llYXIgJT4lCiAgICBmaWx0ZXIoWWVhciA9PSAyMDAwKSAlPiUKICAgIGlubmVyX2pvaW4oQ2Vuc3VzLjIwMDAsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpKSwKICAgIChncm91cGVkX3llYXIgJT4lCiAgICBmaWx0ZXIoWWVhciA9PSAyMDEwKSAlPiUKICAgIGlubmVyX2pvaW4oQ2Vuc3VzLjIwMTAsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpKSkgJT4lCiAgICBzZWxlY3QoLUF2ZXJhZ2UuSG91c2UuUHJpY2VzKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBZZWFyLCB2YWx1ZXNfZnJvbSA9IFBvcHVsYXRpb24pICU+JQogICAgZHBseXI6OnJlbmFtZSgiUG9wdWxhdGlvbi4yMDAwIiA9ICIyMDAwIiwgIlBvcHVsYXRpb24uMjAxMCIgPSAiMjAxMCIpCmIyIDwtCiAgcmJpbmQoCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMjAwMCkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4yMDEwLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSksCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMjAxMCkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4yMDEwLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSkpICU+JQogICAgc2VsZWN0KC1Qb3B1bGF0aW9uKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBZZWFyLCB2YWx1ZXNfZnJvbSA9IEF2ZXJhZ2UuSG91c2UuUHJpY2VzKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoIkF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCIgPSAiMjAwMCIsICJBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAiID0gIjIwMTAiKQpWYWx1ZXMuMjAwMC4yMDEwIDwtCiAgYTIgJT4lIAogIGlubmVyX2pvaW4oYjIsIGJ5ID0gam9pbl9ieShTdGF0ZSkpICU+JSAKICBzZWxlY3QoLUNvZGUueSwgLVJlZ2lvbi55KSAlPiUKICBkcGx5cjo6cmVuYW1lKCJDb2RlIiA9ICJDb2RlLngiLCAiUmVnaW9uIiA9ICJSZWdpb24ueCIpICU+JQogIGZpbHRlcihTdGF0ZSAhPSAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiKQpWYWx1ZXMuMjAwMC4yMDEwCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEyfQpWYWx1ZXMuMjAwMC4yMDEwIDwtIAogIFZhbHVlcy4yMDAwLjIwMTAgJT4lCiAgYXJyYW5nZShBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApCgpicDcgPC0gZ2dwbG90KGRhdGEgPSBoZWFkKFZhbHVlcy4yMDAwLjIwMTAsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApL0F2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtibHVlIiwgYWxwaGEgPSAwLjcpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IHJvdW5kKCgoQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDEwIC0gQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDAwKS9BdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApKjEwMCwgMikpLCBudWRnZV94ID0gLTAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkxlYXN0IFByaWNlIENoYW5nZSIpICsKICB4bGFiKCJTdGF0ZSIpICsgeWxhYigiUHJpY2UgRGlmZmVyZW5jZSAlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU3RhdGVzIHdpdGggdGhlIGxvd2VzdCBwZXJjZW50YWdlIHByaWNlIGNoYW5nZSBiZXR3ZWVuIDIwMDAgYW5kIDIwMTAiKQpicDggPC0gZ2dwbG90KGRhdGEgPSB0YWlsKFZhbHVlcy4yMDAwLjIwMTAsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApL0F2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtncmVlbiIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAwMCkvQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDAwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IDAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIk1vc3QgUHJpY2UgQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlICUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgaGlnaGVzdCBwZXJjZW50YWdlIHByaWNlIGNoYW5nZSBiZXR3ZWVuIDIwMDAgYW5kIDIwMTAiKQpncmlkLmFycmFuZ2UoYnA3LCBicDgsIG5jb2wgPSAyKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMn0KVmFsdWVzLjIwMDAuMjAxMCA8LSAKICBWYWx1ZXMuMjAwMC4yMDEwICU+JQogIGFycmFuZ2UoUG9wdWxhdGlvbi4yMDEwIC0gUG9wdWxhdGlvbi4yMDAwKQoKYnA5IDwtIGdncGxvdChkYXRhID0gaGVhZChWYWx1ZXMuMjAwMC4yMDEwLCA1KSwgYWVzKHggPSBTdGF0ZSwgeSA9ICgoUG9wdWxhdGlvbi4yMDEwIC0gUG9wdWxhdGlvbi4yMDAwKS9Qb3B1bGF0aW9uLjIwMDApKjEwMCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJkYXJrYmx1ZSIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKFBvcHVsYXRpb24uMjAxMCAtIFBvcHVsYXRpb24uMjAwMCkvUG9wdWxhdGlvbi4yMDAwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IC0wLjEsIHNpemUgPSAzKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJMZWFzdCBQb3B1bGF0aW9uIENoYW5nZSIpICsKICB4bGFiKCJTdGF0ZSIpICsgeWxhYigiUHJpY2UgRGlmZmVyZW5jZSAlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU3RhdGVzIHdpdGggdGhlIGxvd2VzdCBwZXJjZW50YWdlIHBvcHVsYXRpb24gY2hhbmdlIGJldHdlZW4gMjAwMCBhbmQgMjAxMCIpCmJwMTAgPC0gZ2dwbG90KGRhdGEgPSB0YWlsKFZhbHVlcy4yMDAwLjIwMTAsIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChQb3B1bGF0aW9uLjIwMTAgLSBQb3B1bGF0aW9uLjIwMDApL1BvcHVsYXRpb24uMjAwMCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtncmVlbiIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKFBvcHVsYXRpb24uMjAxMCAtIFBvcHVsYXRpb24uMjAwMCkvUG9wdWxhdGlvbi4yMDAwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IDAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIk1vc3QgUG9wdWxhdGlvbiBDaGFuZ2UiKSArCiAgeGxhYigiU3RhdGUiKSArIHlsYWIoIlByaWNlIERpZmZlcmVuY2UgJSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlN0YXRlcyB3aXRoIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2UgcG9wdWxhdGlvbiBjaGFuZ2UgYmV0d2VlbiAyMDAwIGFuZCAyMDEwIikKZ3JpZC5hcnJhbmdlKGJwOSwgYnAxMCwgbmNvbCA9IDIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEyfQpnZ3Bsb3QoZGF0YSA9IFZhbHVlcy4yMDAwLjIwMTAsIGFlcyh4ID0gKFBvcHVsYXRpb24uMjAxMCAtIFBvcHVsYXRpb24uMjAwMCksIHkgPSAoQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDEwIC0gQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDAwKSwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBjb2xvciA9ICdkYXJrZ3JleScsIGFscGhhID0gMC40LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBsaW5ld2lkdGggPSAxLCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gQ29kZSksIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSAyMCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiKDIwMDAgYW5kIDIwMTApIFRyZW5kIEJldHdlZW4gUG9wdWxhdGlvbiBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIkRpZmZlcmVuY2UgaW4gUG9wdWxhdGlvbiIpICsgeWxhYigiRGlmZmVyZW5jZSBpbiBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTY2F0dGVycGxvdCBleHBsYWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGlmZmVyZW5jZSBpbiBwb3B1bGF0aW9uIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiBob3VzZSBwcmljZXMgYmV0d2VlbiAyMDAwIGFuZCAyMDEwIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjIwMDAuMjAxMCwgYWVzKHggPSAoUG9wdWxhdGlvbi4yMDEwIC0gUG9wdWxhdGlvbi4yMDAwKSwgeSA9IChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGZvcm11bGEgPSB5fngsIGNvbG9yID0gJ2RhcmtncmV5JywgYWxwaGEgPSAwLjQsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGxpbmV3aWR0aCA9IDEsIHNlID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBDb2RlKSwgc2l6ZSA9IDIsIG1heC5vdmVybGFwcyA9IDIwKSArCiAgZmFjZXRfd3JhcCh+UmVnaW9uLCBucm93ID0gMikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiKDIwMDAgYW5kIDIwMTApIFRyZW5kIEJldHdlZW4gUG9wdWxhdGlvbiBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIkRpZmZlcmVuY2UgaW4gUG9wdWxhdGlvbiIpICsgeWxhYigiRGlmZmVyZW5jZSBpbiBIb3VzZSBQcmljZXMiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTY2F0dGVycGxvdCBleHBsYWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGlmZmVyZW5jZSBpbiBwb3B1bGF0aW9uIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiBob3VzZSBwcmljZXMgYmV0d2VlbiAyMDAwIGFuZCAyMDEwIGZhY2V0ZWQgYnkgcmVnaW9uIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjIwMDAuMjAxMCwgYWVzKHggPSBsb2coKFBvcHVsYXRpb24uMjAxMCAvIFBvcHVsYXRpb24uMjAwMCkpLCB5ID0gbG9nKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLyBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApKSwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIigyMDAwIGFuZCAyMDEwKSBUcmVuZCBCZXR3ZWVuIFBvcHVsYXRpb24gYW5kIEhvdXNlIFByaWNlcyIpICsKICB4bGFiKCJQcm9wb3J0aW9uIG9mIFBvcHVsYXRpb24gKGxvZyBzY2FsZSkiKSArIHlsYWIoIlByb3BvcnRpb24gb2YgSG91c2UgUHJpY2VzIChsb2cgc2NhbGUpIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU2NhdHRlcnBsb3QgZXhwbGFpbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJhdGlvIG9mIHBvcHVsYXRpb24gYW5kIHRoZSByYXRpbyBvZiBob3VzZSBwcmljZXMgYmV0d2VlbiAyMDAwIGFuZCAyMDEwIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjIwMDAuMjAxMCwgYWVzKHggPSBsb2coKFBvcHVsYXRpb24uMjAxMCAvIFBvcHVsYXRpb24uMjAwMCkpLCB5ID0gbG9nKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTAgLyBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMDApKSwgY29sb3IgPSBTdGF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gJ2RvdHRlZCcsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICBmYWNldF93cmFwKH5SZWdpb24sIG5yb3cgPSAyKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCIoMjAwMCBhbmQgMjAxMCkgVHJlbmQgQmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiUHJvcG9ydGlvbiBvZiBQb3B1bGF0aW9uIChsb2cgc2NhbGUpIikgKyB5bGFiKCJQcm9wb3J0aW9uIG9mIEhvdXNlIFByaWNlcyAobG9nIHNjYWxlKSIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByYXRpbyBvZiBwb3B1bGF0aW9uIGFuZCB0aGUgcmF0aW8gb2YgaG91c2UgcHJpY2VzIGJldHdlZW4gMjAwMCBhbmQgMjAxMCBmYWNldGVkIGJ5IHJlZ2lvbiIpICsKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMSwgImxpbmVzIikpCmBgYAoKIyMjIFllYXIgUmFuZ2UgLSAyMDEwIHRvIDIwMTkKCmBgYHtyfQphMyA8LSAKICByYmluZCgKICAgIChncm91cGVkX3llYXIgJT4lCiAgICBmaWx0ZXIoWWVhciA9PSAyMDEwKSAlPiUKICAgIGlubmVyX2pvaW4oQ2Vuc3VzLjIwMTAsIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpKSwKICAgIChncm91cGVkX3llYXIgJT4lCiAgICBmaWx0ZXIoWWVhciA9PSAyMDE5KSAlPiUKICAgIGlubmVyX2pvaW4oQ2Vuc3VzLjIwMTksIGJ5ID0gam9pbl9ieShTdGF0ZSA9PSBTdGF0ZSkpKSkgJT4lCiAgICBzZWxlY3QoLUF2ZXJhZ2UuSG91c2UuUHJpY2VzKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBZZWFyLCB2YWx1ZXNfZnJvbSA9IFBvcHVsYXRpb24pICU+JQogICAgZHBseXI6OnJlbmFtZSgiUG9wdWxhdGlvbi4yMDEwIiA9ICIyMDEwIiwgIlBvcHVsYXRpb24uMjAxOSIgPSAiMjAxOSIpCmIzIDwtCiAgcmJpbmQoCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMjAxMCkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4yMDEwLCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSksCiAgICAoZ3JvdXBlZF95ZWFyICU+JQogICAgZmlsdGVyKFllYXIgPT0gMjAxOSkgJT4lCiAgICBpbm5lcl9qb2luKENlbnN1cy4yMDE5LCBieSA9IGpvaW5fYnkoU3RhdGUgPT0gU3RhdGUpKSkpICU+JQogICAgc2VsZWN0KC1Qb3B1bGF0aW9uKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBZZWFyLCB2YWx1ZXNfZnJvbSA9IEF2ZXJhZ2UuSG91c2UuUHJpY2VzKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoIkF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCIgPSAiMjAxMCIsICJBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTkiID0gIjIwMTkiKQpWYWx1ZXMuMjAxMC4yMDE5IDwtCiAgYTMgJT4lIAogIGlubmVyX2pvaW4oYjMsIGJ5ID0gam9pbl9ieShTdGF0ZSkpICU+JSAKICBzZWxlY3QoLUNvZGUueSwgLVJlZ2lvbi55KSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiQ29kZSIgPSAiQ29kZS54IiwgIlJlZ2lvbiIgPSAiUmVnaW9uLngiKSAlPiUKICBmaWx0ZXIoU3RhdGUgIT0gIkRpc3RyaWN0IG9mIENvbHVtYmlhIikKVmFsdWVzLjIwMTAuMjAxOQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMn0KVmFsdWVzLjIwMTAuMjAxOSA8LSAKICBWYWx1ZXMuMjAxMC4yMDE5ICU+JQogIGFycmFuZ2UoQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDE5IC0gQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDEwKQoKYnAxMSA8LSBnZ3Bsb3QoZGF0YSA9IGhlYWQoVmFsdWVzLjIwMTAuMjAxOSwgNSksIGFlcyh4ID0gU3RhdGUsIHkgPSAoKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxOSAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkvQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDEwKSoxMDApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZGFya2JsdWUiLCBhbHBoYSA9IDAuNykgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gcm91bmQoKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTkgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTApL0F2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkqMTAwLCAyKSksIG51ZGdlX3ggPSAtMC4xLCBzaXplID0gMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiTGVhc3QgUHJpY2UgQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlICUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgbG93ZXN0IHBlcmNlbnRhZ2UgcHJpY2UgY2hhbmdlIGJldHdlZW4gMjAxMCBhbmQgMjAxOSIpCmJwMTIgPC0gZ2dwbG90KGRhdGEgPSB0YWlsKFZhbHVlcy4yMDEwLjIwMTksIDUpLCBhZXMoeCA9IFN0YXRlLCB5ID0gKChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTkgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTApL0F2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkqMTAwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImRhcmtncmVlbiIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxOSAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkvQXZlcmFnZS5Ib3VzZS5QcmljZS4yMDEwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IDAuMSwgc2l6ZSA9IDMpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIk1vc3QgUHJpY2UgQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlICUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgaGlnaGVzdCBwZXJjZW50YWdlIHByaWNlIGNoYW5nZSBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkiKQpncmlkLmFycmFuZ2UoYnAxMSwgYnAxMiwgbmNvbCA9IDIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEyfQpWYWx1ZXMuMjAxMC4yMDE5IDwtIAogIFZhbHVlcy4yMDEwLjIwMTkgJT4lCiAgYXJyYW5nZShQb3B1bGF0aW9uLjIwMTkgLSBQb3B1bGF0aW9uLjIwMTApCgpicDEzIDwtIGdncGxvdChkYXRhID0gaGVhZChWYWx1ZXMuMjAxMC4yMDE5LCA1KSwgYWVzKHggPSBTdGF0ZSwgeSA9ICgoUG9wdWxhdGlvbi4yMDE5IC0gUG9wdWxhdGlvbi4yMDEwKS9Qb3B1bGF0aW9uLjIwMTApKjEwMCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJkYXJrYmx1ZSIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSByb3VuZCgoKFBvcHVsYXRpb24uMjAxOSAtIFBvcHVsYXRpb24uMjAxMCkvUG9wdWxhdGlvbi4yMDEwKSoxMDAsIDIpKSwgbnVkZ2VfeCA9IC0wLjEsIHNpemUgPSAzKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJMZWFzdCBQb3B1bGF0aW9uIENoYW5nZSIpICsKICB4bGFiKCJTdGF0ZSIpICsgeWxhYigiUHJpY2UgRGlmZmVyZW5jZSAlIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU3RhdGVzIHdpdGggdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBwb3B1bGF0aW9uIGNoYW5nZSBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkiKQpicDE0IDwtIGdncGxvdChkYXRhID0gdGFpbChWYWx1ZXMuMjAxMC4yMDE5LCA1KSwgYWVzKHggPSBTdGF0ZSwgeSA9ICgoUG9wdWxhdGlvbi4yMDE5IC0gUG9wdWxhdGlvbi4yMDEwKS9Qb3B1bGF0aW9uLjIwMTApKjEwMCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuNykgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gcm91bmQoKChQb3B1bGF0aW9uLjIwMTkgLSBQb3B1bGF0aW9uLjIwMTApL1BvcHVsYXRpb24uMjAxMCkqMTAwLCAyKSksIG51ZGdlX3ggPSAwLjEsIHNpemUgPSAzKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJNb3N0IFBvcHVsYXRpb24gQ2hhbmdlIikgKwogIHhsYWIoIlN0YXRlIikgKyB5bGFiKCJQcmljZSBEaWZmZXJlbmNlICUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTdGF0ZXMgd2l0aCB0aGUgaGlnaGVzdCBwZXJjZW50YWdlIHBvcHVsYXRpb24gY2hhbmdlIGJldHdlZW4gMjAxMCBhbmQgMjAxOSIpCmdyaWQuYXJyYW5nZShicDEzLCBicDE0LCBuY29sID0gMikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CmdncGxvdChkYXRhID0gVmFsdWVzLjIwMTAuMjAxOSwgYWVzKHggPSAoUG9wdWxhdGlvbi4yMDE5IC0gUG9wdWxhdGlvbi4yMDEwKSwgeSA9IChBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTkgLSBBdmVyYWdlLkhvdXNlLlByaWNlLjIwMTApLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGZvcm11bGEgPSB5fngsIGNvbG9yID0gJ2RhcmtncmV5JywgYWxwaGEgPSAwLjQsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGxpbmV3aWR0aCA9IDEsIHNlID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBDb2RlKSwgc2l6ZSA9IDIsIG1heC5vdmVybGFwcyA9IDIwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCIoMjAxMCBhbmQgMjAxOSkgVHJlbmQgQmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiRGlmZmVyZW5jZSBpbiBQb3B1bGF0aW9uIikgKyB5bGFiKCJEaWZmZXJlbmNlIGluIEhvdXNlIFByaWNlcyIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHBvcHVsYXRpb24gYW5kIHRoZSBkaWZmZXJlbmNlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkiKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBWYWx1ZXMuMjAxMC4yMDE5LCBhZXMoeCA9IChQb3B1bGF0aW9uLjIwMTkgLSBQb3B1bGF0aW9uLjIwMTApLCB5ID0gKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxOSAtIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCksIGNvbG9yID0gU3RhdGUpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgZm9ybXVsYSA9IHl+eCwgY29sb3IgPSAnZGFya2dyZXknLCBhbHBoYSA9IDAuNCwgbGluZXR5cGUgPSAnZGFzaGVkJywgbGluZXdpZHRoID0gMSwgc2UgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IENvZGUpLCBzaXplID0gMiwgbWF4Lm92ZXJsYXBzID0gMjApICsKICBmYWNldF93cmFwKH5SZWdpb24sIG5yb3cgPSAyKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCIoMjAxMCBhbmQgMjAxOSkgVHJlbmQgQmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBIb3VzZSBQcmljZXMiKSArCiAgeGxhYigiRGlmZmVyZW5jZSBpbiBQb3B1bGF0aW9uIikgKyB5bGFiKCJEaWZmZXJlbmNlIGluIEhvdXNlIFByaWNlcyIpICsKICBsYWJzKHN1YnRpdGxlID0gIlNjYXR0ZXJwbG90IGV4cGxhaW5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHBvcHVsYXRpb24gYW5kIHRoZSBkaWZmZXJlbmNlIGluIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkgZmFjZXRlZCBieSByZWdpb24iKSArCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEsICJsaW5lcyIpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBWYWx1ZXMuMjAxMC4yMDE5LCBhZXMoeCA9IGxvZygoUG9wdWxhdGlvbi4yMDE5IC8gUG9wdWxhdGlvbi4yMDEwKSksIHkgPSBsb2coKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxOSAvIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkpLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBjb2xvciA9ICdkYXJrZ3JleScsIGFscGhhID0gMC40LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBsaW5ld2lkdGggPSAxLCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gQ29kZSksIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSAzMCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiKDIwMTAgYW5kIDIwMTkpIFRyZW5kIEJldHdlZW4gUG9wdWxhdGlvbiBhbmQgSG91c2UgUHJpY2VzIikgKwogIHhsYWIoIlByb3BvcnRpb24gb2YgUG9wdWxhdGlvbiAobG9nIHNjYWxlKSIpICsgeWxhYigiUHJvcG9ydGlvbiBvZiBIb3VzZSBQcmljZXMgKGxvZyBzY2FsZSkiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJTY2F0dGVycGxvdCBleHBsYWluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcmF0aW8gb2YgcG9wdWxhdGlvbiBhbmQgdGhlIHJhdGlvIG9mIGhvdXNlIHByaWNlcyBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkiKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KZ2dwbG90KGRhdGEgPSBWYWx1ZXMuMjAxMC4yMDE5LCBhZXMoeCA9IGxvZygoUG9wdWxhdGlvbi4yMDE5IC8gUG9wdWxhdGlvbi4yMDEwKSksIHkgPSBsb2coKEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxOSAvIEF2ZXJhZ2UuSG91c2UuUHJpY2UuMjAxMCkpLCBjb2xvciA9IFN0YXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAnZG90dGVkJywgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICdkb3R0ZWQnLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBmb3JtdWxhID0geX54LCBjb2xvciA9ICdkYXJrZ3JleScsIGFscGhhID0gMC40LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBsaW5ld2lkdGggPSAxLCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShndWlkZSA9ICJub25lIikgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gQ29kZSksIHNpemUgPSAyLCBtYXgub3ZlcmxhcHMgPSAzMCkgKwogIGZhY2V0X3dyYXAoflJlZ2lvbiwgbnJvdyA9IDIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIigyMDEwIGFuZCAyMDE5KSBUcmVuZCBCZXR3ZWVuIFBvcHVsYXRpb24gYW5kIEhvdXNlIFByaWNlcyIpICsKICB4bGFiKCJQcm9wb3J0aW9uIG9mIFBvcHVsYXRpb24gKGxvZyBzY2FsZSkiKSArIHlsYWIoIlByb3BvcnRpb24gb2YgSG91c2UgUHJpY2VzIChsb2cgc2NhbGUpIikgKwogIGxhYnMoc3VidGl0bGUgPSAiU2NhdHRlcnBsb3QgZXhwbGFpbmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJhdGlvIG9mIHBvcHVsYXRpb24gYW5kIHRoZSByYXRpbyBvZiBob3VzZSBwcmljZXMgYmV0d2VlbiAyMDEwIGFuZCAyMDE5IGZhY2V0ZWQgYnkgcmVnaW9uIikgKwogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKSkKYGBg